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

时间:2009-05-03 04:28:44

标签: c# wpf xaml custom-controls

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

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

TextBox

然后我在我的应用中使用这个自定义文本框,如(xaml):

DefaultAction

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

...所以我的问题是,如何改善上述控制?或者可能还有其他方法可以进行上述控制吗? ...也许只使用声明性代码而不是声明性(xaml)和程序性(C#)?

5 个答案:

答案 0 :(得分:31)

从几个月前看看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。我相信这可以让你得到你想要的东西。

答案 1 :(得分:25)

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

示例:

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

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

答案 2 :(得分:1)

当用户按下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文档

答案 3 :(得分:-2)

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

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

答案 4 :(得分:-2)

xaml中的事件添加到特定文本框或对象:

KeyDown="txtBarcode_KeyDown"