在winrt文本框上捕获Tab键

时间:2015-08-05 13:03:42

标签: c# xaml windows-runtime winrt-xaml keyboard-events

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

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

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

如何在TextBox上订阅Tab键的使用?

2 个答案:

答案 0 :(得分:2)

看起来新焦点元素会收到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;
}

答案 1 :(得分:0)

我的问题是KeyUp事件中没有收到Tab虚拟键,而其他键(Esc,Enter,字母数字键)是。我刚用相同的处理程序将其更改为KeyDown。差异似乎是用户难以察觉的。