UWP 中的 TextBox 未触发 KeyDown 事件

KeyDown Event not fired for TextBox in UWP

当我按下 Enter 键时,如果 AcceptsReturn 属性 设置为真,则不会触发 TextBoxKeyDown 事件。如何识别何时为 TextBox 按下 Enter 键,AcceptsReturn 设置为 true

在 XAML 中:

<TextBox VerticalAlignment="Top" KeyDown="TextBox_KeyDown"/>

后面的代码:

private void TextBox_KeyDown(object sender, KeyRoutedEventArgs e)
    {
        Debug.WriteLine(e.Key);
    }

从输出中可以看出,Enter 被识别了。

When i press enter key, Key Down event for the Text Box is not fired. This happens only when i set Accepts Return property of text Box as true.

这是因为如果AcceptsReturn设置为true,TextBox允许换行符,所以当你按下回车键时,它会开始一个新的行,而KeyDown事件不会被辞退了。否则,如果它设置为false(默认为false),当你按下回车键时,它使这个TextBox处于输入焦点状态,KeyDown事件可以被触发。

How can i identify when the Enter key is pressed ?

恐怕你不能在这种情况下使用 KeyDown 事件来识别 Enter 键,但你可以在后面的代码中使用 TextBox.TextChanged event 来获得通知,因为它会在输入时开始一个新行键被按下。

我试过下面的代码,它对我有用,

var textBox = new TextBox();
KeyEventHandler keyeventHandler = new KeyEventHandler(textBox_KeyDown);

textBox.AddHandler(TextBox.KeyDownEvent, keyeventHandler, true);

private void textBox_KeyDown(object sender, KeyEventArgs e)
{
*** now Enter Key gets fired eventhough when i set AcceptsReturn as True ***
}

如果您希望完全禁用新行(就像@ruffin 想要的那样),请通过隐藏代码订阅 PreviewKeyDown 事件并将 e.Handled 设置为 true

    public MyControl()
    {
        InitializeComponent();

        var keyeventHandler = new KeyEventHandler(TextBox_KeyDown);
        uiText.AddHandler(PreviewKeyDownEvent, keyeventHandler, handledEventsToo: true);
    }

    private void TextBox_KeyDown(object sender, KeyRoutedEventArgs e)
    {
        if (e.Key == Windows.System.VirtualKey.Enter)
            e.Handled = true;
    }