在winrt文本框上捕获Tab键

本文关键字:Tab winrt 文本 | 更新日期: 2023-09-27 18:06:25

我正在构建一个XAML应用程序(winrt)在企业中使用。应用程序中的一些表单可能很复杂:一些输入会根据其他输入显示/隐藏。我想控制标签键导航使用的行为在所有输入(TextBox, PasswordBow, ComboBox…),以优化用户活动。

我订阅了文本框的KeyUp事件,但是当用户点击Tab键时,该事件不会引发。因此,可视化树中的下一个元素被赋予键盘焦点。

我发现没有方法覆盖像winform的IsInputKey

我如何订阅在文本框上使用Tab键?

在winrt文本框上捕获Tab键

看起来新焦点元素收到了KeyUp事件。

我所做的是订阅KeyDown事件,检查Tab键并将事件标记为已处理。

protected override void OnAttached()
{
    var textBox = (TextBox)this.AssociatedObject;
    textBox.KeyDown += this.OnKeyDown;
    textBox.KeyUp += this.OnKeyUp;
    // don't forget to unsubscribe in OnDetached
}
private void OnKeyDown(object sender, KeyRoutedEventArgs e)
{
    if (e.Key == VirtualKey.Tab && !e.Handled)
    {
        e.Handled = this.Work(sender, e);
    }
}
private void OnKeyUp(object sender, KeyRoutedEventArgs e)
{
    if (e.Key != VirtualKey.Tab && !e.Handled)
    {
        e.Handled = this.Work(sender, e);
    }
}

这是聚焦工作的方法。在我知道怎么做之前,代码是在OnKeyUp中。

/// <returns>true if an action has been performed (focus next or execute command)</returns>
private bool Work(object sender, KeyRoutedEventArgs e)
{
    var isEnterKey = e.Key == VirtualKey.Enter;
    var isTabKey = e.Key == VirtualKey.Tab;
    if (/* there is something else to focus */)
    {
        // focus it
        return true;
    }
    return false;
}

我的问题是Tab虚拟键在KeyUp事件中没有被接收,而其他键(Esc,Enter,字母数字键)被接收。我只是用相同的处理器把它改成了KeyDown。