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 解决方案,而不是使用自定义控件。将KeyBindings 分配给ReturnEnter 以指向一个命令可以做到这一点。

例子:

<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 键时触发的事件的主要内容,如果未能解决你的问题,请参考以下文章

按下 Enter 键时如何关闭 WPF 窗口(对话框)?

文本框输入移动设备的替代密钥

在 VC6-MFC 中按 ENTER 键时的 TAB 效果

在 Enter 键上提交登录信息 [重复]

当我在文本框中按 Enter 键时发出恼人的哔哔声

按键时清除文本框