WPF:一个TextBox,它有一个按下Enter键时触发的事件

我没有在我的应用程序中为每个TextBox附加PreviewKeyUp事件并检查按下的键是否为Enter键然后执行操作,而是决定实现包含DefaultAction事件的TextBox扩展版本,该事件在按下Enter键时触发在TextBox

我所做的基本上是创建一个新的类,它使用公共事件DefaultActionTextBox扩展,如下所示:

 public class DefaultTextBoxControl:TextBox { public event EventHandler 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):

   

现在,在我学习WPF的过程中,我已经意识到几乎大部分时间都有一种“更酷”(并且希望更容易)实现的方式

…所以我的问题是, 我怎样才能改善上述控制? 或者是否有另一种方法可以进行上述控制? …也许只使用声明性代码而不是声明性(xaml)和程序性(C#)?

几个月前看一下这篇博客文章 ,我将一个’全局’事件处理程序附加到TextBox.GotFocus来选择文本。

基本上你可以在App类中处理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_KeyUp方法时,应用程序中的每个TextBox都会调用它们。

更新

正如您在评论中指出的那样,这仅在每个TextBox需要执行相同代码时才有用。

要添加像Enter键一样的任意事件,您可能最好不要查看附加事件 。 我相信这可以让你得到你想要的。

由于问了这个问题,现在TextBoxes和其他控件上有一个InputBindings属性。 有了这个,可以使用纯XAML解决方案,而不是使用自定义控件。 为ReturnEnter分配KeyBinding以指向命令可以执行此操作。

例:

       

有人提到Enter并不总是有效,而Return可能会在某些系统上使用。

当用户按下TextBox中的Enter键时,文本框中的输入将出现在用户界面(UI)的另一个区域中。

以下XAML创建用户界面,该界面由StackPanel,TextBlock和TextBox组成。

   Type some text into the TextBox and press the Enter key.     

后面的代码创建了KeyDown事件处理程序。 如果按下的键是Enter键,则TextBlock中会显示一条消息。

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

有关更多信息,请阅读MSDN Doc

  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"