سؤال

لدي بسيطة Converter يضيف رمز "+" إلى رقم موجب يتم إدخاله في TextBox. وبعد عندما يتم إدخال الرقم، أريد أن أبدأ بعض الإجراءات، لكنني لا أريد الانتظار حتى TextBox يفقد التركيز: أريد تحديث الربط على الفور حيث يدخل المستخدم النص.

السلوك الافتراضي ل TextBox هو أنه عندما يقوم المستخدم بالتنقل بعيدا عن المربع، يتم تحديث مصدر الربط (Updateourcetrigger = LostFocus). في هذا السيناريو، يعمل محولي كما هو متوقع، ويتم إضافة +. ومع ذلك، عندما أقوم بتغييره إلى ما يلي، فإن + هو مطلقا وأضاف.

<TextBox Text="{Binding Value, Converter={StaticResource PlusConverter}, UpdateSourceTrigger=PropertyChanged}" />

أستطيع أن أتخيل أن هناك سبب وجيه لعدم استدعاء طريقة My Converter.convert (). أرغب في الحصول على السلوك التالي:

  1. عندما يدخل المستخدمون النص، يتم تحديث المصدر على الفور
  2. عندما TextBox يفقد التركيز، يتم إضافة +.

الآن أنا أبحث عن طريقة لطيفة ولكنها عامة للقيام بذلك (عندما يكون لدي الكثير من هذه النصوص في تطبيقي). حتى الآن لم أتمكن من التوصل إلى حل مناسب.

هل كانت مفيدة؟

المحلول 3

شكرا لإجاباتك! نظرت إلى هذه المسألة نفسي في المستقبل وتوصل إلى الحل التالي (الذي لست راضيا تماما عنه، لكنه يعمل بشكل جيد)

لقد قمت بإنشاء CustomControl تضيف وظائف إلى TextBox.

قدمت معالج حدث لحدث LostFocus عند حدوث هذا الحدث، يتم استدعاء محولي.

ومع ذلك، فإن الطريقة التي أستخدم فيها محول ليست مرضية للغاية (أعتبرها من النمط المرتبط بنصبي النص). يحتوي النمط على STERTER الخاص بميزة النص. من هذا المسرد يمكنني الوصول إلى محول بلدي.

بالطبع، يمكنني أيضا أن أجعل "plustextbox"، لكنني أستخدم محولات مختلفة وأردت محلول عام.

public class TextBoxEx : TextBox
{
    public TextBoxEx()
    {
        AddHandler(LostFocusEvent,
          new RoutedEventHandler(CallConverter), true);
    }

    public Type SourceType
    {
        get { return (Type)GetValue(SourceTypeProperty); }
        set { SetValue(SourceTypeProperty, value); }
    }

    // Using a DependencyProperty as the backing store for SourceType.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SourceTypeProperty =
        DependencyProperty.Register("SourceType", typeof(Type), typeof(TextBoxEx), new UIPropertyMetadata(null));

    private static void CallConverter(object sender, RoutedEventArgs e)
    {
        TextBoxEx textBoxEx = sender as TextBoxEx;
        if (textBoxEx.Style == null) {
            return;
        }
        if (textBoxEx.SourceType == null) {
        }
        foreach (Setter setter in textBoxEx.Style.Setters) {
            if (setter.Property.ToString() == "Text") {
                if (! (setter.Value is Binding) ) {
                    return;
                }
                Binding binding = setter.Value as Binding;
                if (binding.Converter == null) {
                    return;
                }
                object value = binding.Converter.ConvertBack(textBoxEx.Text, textBoxEx.SourceType, binding.ConverterParameter, System.Globalization.CultureInfo.CurrentCulture);
                value = binding.Converter.Convert(value, typeof(string), binding.ConverterParameter, System.Globalization.CultureInfo.CurrentCulture);
                if (!(value is string)) {
                    return;
                }
                textBoxEx.Text = (string)value;
            }
        }
    }
}

نصائح أخرى

توافق مع W / KENT B، تحتاج إلى نشر رمز المحول الخاص بك.

لقد تمكنت من الحصول على جزء 1 للعمل مع محول بسيط (أنا ملزم TextBlock ثاني غير قابل للتحميل لإظهار أن القيمة هي بالفعل تحديثها).

ومع ذلك، إذا فهمت الجزء 2، فأنت تحاول الحصول على مربع الكتابةالنص للتحديث مع "+" بعد أن تخسر التركيز. هذا مهتز قليلا ولا أعتقد أنك ستكون قادرا على القيام بذلك بمجرد iConverter. إذا كان يمكن القيام به، أحب أن أعرف الإجابة كذلك.

ما تطلبه أساسا هو سلوك الإدخال العلامة المائية، على سبيل المثال، السماح للمستخدم بإدخال بعض البيانات، ولديه مهيأ بشكل صحيح (كلاهما في البيانات الأساسية وفي UI). أسرع / أقذر الحل لهذا هو التعامل مع Lostfocus TextBoxes ولكن نظرا لأنك تستخدم ذلك في جميع أنحاء تطبيقك، فقد لا يكون هذا ممكنا.

يمكنك أيضا التفكير في كتابة مربع النص في UserControl الخاص بك. إذا نظرت إلى تنفيذ Wpftoolkit ل DatePicker له سلوك مماثل: اسمح للمستخدم بإدخال نص النموذج المجاني، ثم تحويل القيمة التلقائي إلى تاريخ بعد (إذا كان صحيحا) وإظهار DateTime بتنسيق مترجم.

هث.

الشيء الآخر الذي قد ترغب في فعله هو تحرير القالب لصندوق TextBox ونقل الجزء الفعلي إلى اليمين قليلا، ثم تشير TextBlock إلى الجزء +/-؛ أي تغيير قالب مربع النص من:

Control
- Border
-- PART_ContentHost (the actual editing part)

داخل:

Control
- Border
-- Horizontal StackPanel
--- TextBlock (contains +/- sign, has 2px right margin)
--- PART_ContentHost (actual editable section)

ثم، ربط محتوى TextBlock الخاص بالنص، ولكن مع محول يكتب إما "+" أو "-". بهذه الطريقة، لا يمكن للمستخدم حذف الجزء +/-، وليس لديك ما يدعو للقلق بشأن تحليله؛ هذا يجعل من الأسهل أيضا إذا كنت ترغب في فعل شيء مثل جعل علامة سلبية حمراء أو شيء من هذا.

في محولك، لم أستطع فقط التحقق من التركيز الحالي للوحة المفاتيح؟ شيء مثل:

TextBox focusedTextBox = Keyboard.FocusedElement as TextBox;
if (focusedTextBox == null || focusedTextBox != senderOrWhatever)
{
 ' this is where you'd add the +, because the textbox doesn't have focus.
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top