وبف:مربع نص يحتوي على حدث يتم تشغيله عند الضغط على مفتاح Enter

StackOverflow https://stackoverflow.com/questions/816334

  •  03-07-2019
  •  | 
  •  

سؤال

بدلاً من إرفاق أ PreviewKeyUp الحدث مع كل TextBox في تطبيقي والتحقق مما إذا كان المفتاح الذي تم الضغط عليه هو مفتاح Enter ثم القيام بإجراء ما، قررت تنفيذ إصدار موسع من TextBox يتضمن حدث DefaultAction الذي يتم تشغيله عند الضغط على مفتاح Enter في ملف TextBox.

ما فعلته هو في الأساس إنشاء فئة جديدة تمتد من TextBox مع حدث عام DefaultAction, ، مثل هذا:

public class DefaultTextBoxControl:TextBox
{
    public event EventHandler<EventArgs> DefaultAction = delegate { };

    public DefaultTextBoxControl()
    {
        PreviewKeyUp += DefaultTextBoxControl_PreviewKeyUp;
    }

    void DefaultTextBoxControl_PreviewKeyUp(object sender, System.Windows.Input.KeyEventArgs e)
    {
        if (e.Key != Key.Enter)
        {
            return;
        }
        DefaultAction(this, EventArgs.Empty);
    }
}

أستخدم بعد ذلك مربع النص المخصص هذا من تطبيقي مثل (xaml):

<Controls:DefaultTextBoxControl  DefaultAction="DefaultTextBoxControl_DefaultAction">
</Controls:DefaultTextBoxControl>

الآن، من خلال خبرتي القليلة في تعلم WPF، أدركت أنه في معظم الأوقات تقريبًا توجد طريقة "أفضل" (وآمل أن تكون أسهل) لتنفيذ الأشياء

...لذا سؤالي هو كيف يمكنني تحسين التحكم أعلاه؟ أو ربما هناك طريقة أخرى يمكنني من خلالها القيام بالتحكم أعلاه؟... ربما تستخدم الكود التعريفي فقط بدلاً من الكود التعريفي (xaml) والإجرائي (C#)؟

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

المحلول

القي نظرة على هذا بلوق وظيفة منذ بضعة أشهر مضت حيث أرفقت معالج الأحداث "العالمي" به TextBox.GotFocus لتحديد النص.

في الأساس يمكنك التعامل مع KeyUp حدث في فئة التطبيق الخاصة بك، مثل هذا:

protected override void OnStartup(StartupEventArgs e)
{
    EventManager.RegisterClassHandler(typeof(TextBox),
        TextBox.KeyUpEvent,
        new System.Windows.Input.KeyEventHandler(TextBox_KeyUp));

    base.OnStartup(e);
}

private void TextBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key != System.Windows.Input.Key.Enter) return;

    // your event handler here
    e.Handled = true;
    MessageBox.Show("Enter pressed");
}

...والآن كل TextBox في التطبيق الخاص بك سوف استدعاء TextBox_KeyUp الطريقة التي يكتب فيها المستخدمون.

تحديث

وكما أشرت في تعليقك، فإن هذا مفيد فقط إذا كان ذلك مفيدًا TextBox يحتاج إلى تنفيذ نفس التعليمات البرمجية.

لإضافة حدث عشوائي مثل الضغط على مفتاح Enter، قد يكون من الأفضل أن تبحث فيه الأحداث المرفقة.أعتقد أن هذا يمكن أن يحصل لك على ما تريد.

نصائح أخرى

ومادمت قد سئلت هذا السؤال، هو الآن هناك خاصية InputBindings على مربعات النص وعناصر التحكم الأخرى. مع هذا، وإيجاد حل XAML بحتة يمكن استخدامها، بدلا من استخدام عناصر التحكم المخصصة. يمكن تعيين KeyBindings لReturn وEnter للإشارة إلى أمر القيام بذلك.

مثال:

<TextBox Text="Test">
    <TextBox.InputBindings>
        <KeyBinding Command="{Binding SomeCommand}" Key="Return" />
        <KeyBinding Command="{Binding SomeCommand}" Key="Enter" />
    </TextBox.InputBindings>
</TextBox>

وقد ذكر البعض أن Enter لا تعمل دائما، ويمكن استخدامه Return على بعض الأنظمة.

وعندما يضغط المستخدم على مفتاح Enter في مربع نص، يظهر الإدخال في مربع النص في منطقة أخرى من واجهة المستخدم (UI).

ووXAML التالية يخلق واجهة المستخدم، والذي يتكون من StackPanel، وTextBlock، ومربع نص.

<StackPanel>
  <TextBlock Width="300" Height="20">
    Type some text into the TextBox and press the Enter key.
  </TextBlock>
  <TextBox Width="300" Height="30" Name="textBox1"
           KeyDown="OnKeyDownHandler"/>
  <TextBlock Width="300" Height="100" Name="textBlock1"/>
</StackPanel>

والتعليمة البرمجية التالية يخلق وراء معالج الحدث KeyDown. إذا كان المفتاح الذي تم الضغط عليه هو مفتاح Enter، يتم عرض رسالة في TextBlock.

private void OnKeyDownHandler(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Return)
    {
        textBlock1.Text = "You Entered: " + textBox1.Text;
    }
}

لمزيد من المعلومات قراءة MSDN الوثيقة

    private void txtBarcode_KeyDown(object sender, KeyEventArgs e)
    {
        string etr = e.Key.ToString();

        if (etr == "Return")
        {
            MessageBox.Show("You Press Enter");
        }
    }

وإضافة الحدث في xaml إلى نص أو كائن معين:

وKeyDown="txtBarcode_KeyDown"

scroll top