TextBoxFocusBehavior - לשיפור חוויית המשתמש ב-WPF
-
כאשר עובדים עם TextBox ב-WPF, לפעמים נרצה לשפר את חוויית המשתמש על ידי ביצוע פעולות אוטומטיות, כמו בחירת כל הטקסט כאשר הרכיב מקבל פוקוס או קביעה אוטומטית של פוקוס על TextBox בעת הטעינה.
אשמח לקבל הערות והארות.
מצו"ב הקוד:
public class TextBoxFocusBehavior { public static bool GetSelectAll(FrameworkElement frameworkElement) { return (bool)frameworkElement.GetValue(SelectAllProperty); } public static void SetSelectAll(FrameworkElement frameworkElement, bool value) { frameworkElement.SetValue(SelectAllProperty, value); } public static bool GetCaptureFocus(FrameworkElement frameworkElement) { return (bool)frameworkElement.GetValue(CaptureFocusProperty); } public static void SetCaptureFocus(FrameworkElement frameworkElement, bool value) { frameworkElement.SetValue(CaptureFocusProperty, value); } public static readonly DependencyProperty CaptureFocusProperty = DependencyProperty.RegisterAttached("CaptureFocus", typeof(bool), typeof(TextBoxFocusBehavior), new FrameworkPropertyMetadata(false, OnCaptureFocusChanged)); public static readonly DependencyProperty SelectAllProperty = DependencyProperty.RegisterAttached("SelectAll", typeof(bool), typeof(TextBoxFocusBehavior), new FrameworkPropertyMetadata(false, OnSelectAllChanged)); private static void OnSelectAllChanged (DependencyObject d, DependencyPropertyChangedEventArgs e) { var frameworkElement = d as FrameworkElement; if (frameworkElement == null) return; if (e.NewValue is bool == false) return; if ((bool)e.NewValue) { frameworkElement.GotFocus += SelectAll; frameworkElement.PreviewMouseDown += IgnoreMouseButton; } else { frameworkElement.GotFocus -= SelectAll; frameworkElement.PreviewMouseDown -= IgnoreMouseButton; } } private static void OnCaptureFocusChanged (DependencyObject d, DependencyPropertyChangedEventArgs e) { var frameworkElement = d as FrameworkElement; if (frameworkElement == null) return; if (e.NewValue is bool == false) return; if ((bool)e.NewValue) { frameworkElement.Loaded += FrameworkElement_Loaded; } else { frameworkElement.Loaded -= FrameworkElement_Loaded; } } private static void FrameworkElement_Loaded(object sender, RoutedEventArgs e) { var frameworkElement = e.OriginalSource as FrameworkElement; frameworkElement.Focus(); } private static void SelectAll(object sender, RoutedEventArgs e) { var frameworkElement = e.OriginalSource as FrameworkElement; if (frameworkElement is TextBox) ((TextBoxBase)frameworkElement).SelectAll(); else if (frameworkElement is PasswordBox) ((PasswordBox)frameworkElement).SelectAll(); } private static void IgnoreMouseButton (object sender, System.Windows.Input.MouseButtonEventArgs e) { var frameworkElement = sender as FrameworkElement; if (frameworkElement == null || frameworkElement.IsKeyboardFocusWithin) return; e.Handled = true; frameworkElement.Focus(); } }
המחלקה TextBoxFocusBehavior מספקת שתי יכולות:
Select All: בחירת כל הטקסט כאשר הרכיב מקבל פוקוס. Capture Focus: קביעה כי רכיב מסוים יקבל פוקוס אוטומטית בעת טעינת החלון.
דוגמאות שימוש:
<TextBox Text="Hello, World!" local:TextBoxFocusBehavior.SelectAll="True" local:TextBoxFocusBehavior.CaptureFocus="True" />
-
סליחה על השאלה הישירה..
זה רלוונטי למישהו כל הקודים שאתה מעלה לפה? -
@ivrtikshoret
כן
מאוד!@pcinfogmach מעלה פתרונות נהדרים לכל מיני דברים
שאנחנו כמפתחים קטנים שלא למדנו מסודר את כל השפה מיסודה ולא בקיאים בה
מוצאים את עצמינו נעזרים בזהאשמח מאוד שתמשיך לעלות מגוון קודים ורעיונות מעין אלו!
--
נ.ב. זה כמובן מעבר לעובדה שמדובר בפורום ציבורי
שזה אומר
שמצד אחד - אין לך חובה לקרוא כל הגיג שעלה
מצד שני - זכותו של כל אנונימי לעלות תכנים כמה שיחפוץ, כל עוד זה עומד בכללי הפורום -
@pcinfogmach אני אישית גם מצטרף לזה שטוב שמעלים פה כאלה דברים אבל שיהיו יותר ברורים למי שלא מבין את כל המושגים שציטטת לדוגמא
טקסטבוקסים או רכיבים אחרים שמכילים טקסט ב-WPF
-
@ivrtikshoret
תודה שעלית את השאלה הזו
אני מאד אוהב לשתף ולעזור אך תהיתי לעצמי לא פעם אם יש בזה תועלת למישהו
היה חסר לי confirmation תודה.
חוץ מזה אני מאוד נבניתי מהפורום כאן הערה פה הערה שם של אנשים טובים על הקודים שלי נתנו לי המון ידע.