وبف:مربع نص يحتوي على حدث يتم تشغيله عند الضغط على مفتاح Enter
-
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 بحتة يمكن استخدامها، بدلا من استخدام عناصر التحكم المخصصة. يمكن تعيين KeyBinding
s ل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"