WPF:一个文本框,它具有在按下 Enter 键时触发的事件
Posted
技术标签:
【中文标题】WPF:一个文本框,它具有在按下 Enter 键时触发的事件【英文标题】:WPF: A TextBox that has an event that fires when the Enter Key is pressed 【发布时间】:2010-10-23 09:55:11 【问题描述】:我没有在我的应用程序中为每个 TextBox
附加一个 PreviewKeyUp
事件并检查按下的键是否是 Enter 键然后执行操作,而是决定实现包含 DefaultAction 的 TextBox
的扩展版本在TextBox
中按下 Enter 键时触发的事件。
我所做的基本上是创建一个从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#) ?
【问题讨论】:
【参考方案1】:看看几个月前的this blog post,我将一个“全局”事件处理程序附加到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
都会在用户输入时调用TextBox_KeyUp
方法。
更新
正如您在评论中指出的那样,这仅在每个 TextBox
需要执行相同的代码时才有用。
要添加像 Enter 按键这样的任意事件,您最好查看Attached Events。我相信这可以得到你想要的。
【讨论】:
但是有了这个,你如何分配按下回车键时会发生什么?因为每个 TextBox 都做不同的事情【参考方案2】:自从提出这个问题以来,TextBoxes 和其他控件现在有了一个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
可能会在某些系统上使用。
【讨论】:
看起来不错,所以我试了一下,但这不起作用。使用一个按钮,我的命令被它没有触发的文本框触发。我什至添加了 Source=StaticResource viewModel 但没有任何效果。 在阅读此答案时设法跳过了 Matthis Kohli 的评论并将其应用于我的情况,幸运的是它确实触发了相关方法【参考方案3】:当用户在 TextBox 中按下 Enter 键时,文本框中的输入会出现在用户界面 (UI) 的另一个区域中。
以下 XAML 创建用户界面,该界面由 StackPanel、TextBlock 和 TextBox 组成。
<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 Doc
【讨论】:
感谢您提供 C# 方面。所有这些其他答案都给我留下了一个不完整的程序。【参考方案4】:否则你可以用 c# 来做任何事情
//at the constructor, subscribe your textbox to the KeyUp event
YOUR_TEXTBOX.KeyUp += OnKeyUp;
//listen to the event
private void OnKeyUp(object sender, KeyEventArgs e)
//when typing, listen to the "Enter" key
if (e.Key == Key.Enter)
Search(); //do something
【讨论】:
【参考方案5】: private void txtBarcode_KeyDown(object sender, KeyEventArgs e)
string etr = e.Key.ToString();
if (etr == "Return")
MessageBox.Show("You Press Enter");
【讨论】:
【参考方案6】:将xaml
中的事件添加到特定的文本框或对象:
KeyDown="txtBarcode_KeyDown"
【讨论】:
以上是关于WPF:一个文本框,它具有在按下 Enter 键时触发的事件的主要内容,如果未能解决你的问题,请参考以下文章