سؤال

أحاول إنشاء سلوك مربع نص للوحة مفاتيح على الشاشة ، ويمكنه تحديث النص في مربع النص ، لكن لا يمكنني الحصول على تركيز مربع النص ونقل القطرات إلى نهاية النص بمجرد الانتهاء من التحديث.

لقد حاولت استخدام textbox.focus () و textbox.select () في كلا الطلبات دون حظ.

شكرا على وقتك

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

المحلول

سيفشل تغيير التركيز من داخل معالج أحداث الإدخال (أي ماوس انقر فوق مفتاح افتراضي) ، لأن حدث ماوس (أو مفتاح) سيعيد التركيز إلى العنصر الأصلي. لجعلها تعمل ، يجب عليك إرسال أمر التركيز إلى وقت لاحق باستخدام Dispatcher هدف.

مثال:

Dispatcher.Invoke(new Action(() =>
{
    textBox1.Focus();
    textBox1.SelectionStart = textBox1.Text.Length;
    // or textBox1.Select(textBox1.Text.Length,0);
}), System.Windows.Threading.DispatcherPriority.Background);

نصائح أخرى

فيما يلي مثال بسيط على نقل المؤشر إلى نهاية مربع النص بمجرد تحديثه.

TextBox.Focus();
TextBox.Text = "sometext ";
TextBox.SelectionStart = TextBox.Text.Length;

كان لدي موقف مماثل وقمت بتوصيل معالج "TextChanged" إلى مربع النص الخاص بي كما هو موضح هنا.

<TextBox Name="tbTextEntry" Width="200" HorizontalAlignment="Center" Background="Plum" Text="{Binding Entered_text,Mode=TwoWay}" TextChanged="OnTextChanged_Handler"></TextBox>

وتعامل مع الحدث مثل هذا (شكرا جيف بيك من التعليق أعلاه):

protected void OnTextChanged_Handler(object sender, RoutedEventArgs e)
{
    TextBox my_text_box = (TextBox)sender;
    my_text_box.SelectionStart = my_text_box.Text.Length;
    Debug.WriteLine("OnTextChanged_Handler called !");
    return;
}

هذا غير فعال للحالات التي يترك فيها الشخص لوحة المفاتيح على الشاشة ويبدأ في استخدام لوحة المفاتيح الحقيقية لأن كل حرف جديد سيتسبب في استدعاء هذا المعالج دون داع لأن المؤشر يعمل بشكل جيد مع لوحة المفاتيح الحقيقية. أي حل أكثر كفاءة الترحيب!

امل ان يساعد. شكرًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top