דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. TextBoxFocusBehavior - לשיפור חוויית המשתמש ב-WPF

TextBoxFocusBehavior - לשיפור חוויית המשתמש ב-WPF

מתוזמן נעוץ נעול הועבר תכנות
6 פוסטים 5 כותבים 183 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • pcinfogmachP לא נמצא
    pcinfogmachP לא נמצא
    pcinfogmach
    כתב ב נערך לאחרונה על ידי pcinfogmach
    #1

    כאשר עובדים עם 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" />
    

    גמ"ח מידע מחשבים ואופיס

    T תגובה 1 תגובה אחרונה
    4
    • I מנותק
      I מנותק
      ivrtikshoret
      כתב ב נערך לאחרונה על ידי
      #2

      סליחה על השאלה הישירה..
      זה רלוונטי למישהו כל הקודים שאתה מעלה לפה?

      M pcinfogmachP 2 תגובות תגובה אחרונה
      0
      • M מנותק
        M מנותק
        mekev
        השיב לivrtikshoret ב נערך לאחרונה על ידי mekev
        #3

        @ivrtikshoret
        כן
        מאוד!

        @pcinfogmach מעלה פתרונות נהדרים לכל מיני דברים
        שאנחנו כמפתחים קטנים שלא למדנו מסודר את כל השפה מיסודה ולא בקיאים בה
        מוצאים את עצמינו נעזרים בזה

        אשמח מאוד שתמשיך לעלות מגוון קודים ורעיונות מעין אלו!

        --
        נ.ב. זה כמובן מעבר לעובדה שמדובר בפורום ציבורי
        שזה אומר
        שמצד אחד - אין לך חובה לקרוא כל הגיג שעלה
        מצד שני - זכותו של כל אנונימי לעלות תכנים כמה שיחפוץ, כל עוד זה עומד בכללי הפורום

        תגובה 1 תגובה אחרונה
        4
        • T מנותק
          T מנותק
          THMV
          השיב לpcinfogmach ב נערך לאחרונה על ידי
          #4

          @pcinfogmach אני אישית גם מצטרף לזה שטוב שמעלים פה כאלה דברים אבל שיהיו יותר ברורים למי שלא מבין את כל המושגים שציטטת לדוגמא

          טקסטבוקסים או רכיבים אחרים שמכילים טקסט ב-WPF

          תגובה 1 תגובה אחרונה
          0
          • dovidD מנותק
            dovidD מנותק
            dovid ניהול
            כתב ב נערך לאחרונה על ידי
            #5

            @THMV סליחה, אתה נמצא בקטגוריית תכנות, וכמדומני שאינך מתכנת.

            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

            בכל נושא אפשר ליצור קשר dovid@tchumim.com

            תגובה 1 תגובה אחרונה
            3
            • pcinfogmachP לא נמצא
              pcinfogmachP לא נמצא
              pcinfogmach
              השיב לivrtikshoret ב נערך לאחרונה על ידי pcinfogmach
              #6

              @ivrtikshoret
              תודה שעלית את השאלה הזו
              אני מאד אוהב לשתף ולעזור אך תהיתי לעצמי לא פעם אם יש בזה תועלת למישהו
              היה חסר לי confirmation תודה.
              חוץ מזה אני מאוד נבניתי מהפורום כאן הערה פה הערה שם של אנשים טובים על הקודים שלי נתנו לי המון ידע.

              גמ"ח מידע מחשבים ואופיס

              תגובה 1 תגובה אחרונה
              3

              בא תתחבר לדף היומי!
              • התחברות

              • אין לך חשבון עדיין? הרשמה

              • התחברו או הירשמו כדי לחפש.
              • פוסט ראשון
                פוסט אחרון
              0
              • דף הבית
              • קטגוריות
              • פוסטים אחרונים
              • משתמשים
              • חיפוש
              • חוקי הפורום