Window.Current.CoreWindow KeyDown 事件不会为在 c# 中按下"Tab"键触发?



我已经尝试了什么?

Window.Current.CoreWindow.KeyDown += keydown;
private void keydown(CoreWindow sender, KeyEventArgs args)
{
//Printing entered key
}

我正在开发UWP应用。在我的应用中windows。current。corewindow为键盘上的所有键触发keydown事件,但"tab"除外。关键。

我不知道为什么事件不触发特定的键?我想在"Tab"时做一些动作按下键。有谁知道,如何在触发事件时">

通过测试,有时按Tab键不会触发CoreWindow.KeyDown事件处理程序时,有一些控件,如Button可以得到焦点在一个页面。您可以尝试添加一个UIElement。KeyDown事件或一个元素。PreviewKeyDown事件到xaml文件中的页面(如MainPage)

更新:

当你使用CoreWindow.KeyDown事件并且有控件可以在你的页面中获得焦点时,按Tab键将让焦点步进选项卡序列,而不是触发CoreWindow.KeyDown事件。当选项卡触发CoreWindow.KeyDown事件时

按下键,焦点定位到最后一个可以得到焦点的控件。

如果你想在Tab时触发CoreWindow.KeyDown事件键按下后,您可以将页面中的TabNavigation设置为Once。如果你想保存选项卡键的功能,步进制表符序列,我们仍然建议您使用UIElement.KeyDown事件或UIElement.PreviewKeyDown事件。例如:Window.Current.Content.KeyDown += Content_KeyDown;

更新:

Window.Current.Content.KeyDown事件为路由事件。关于路由事件,您可以参考文档。路由事件是可能从子对象传递(路由)到对象树中每个后续父对象的事件。

在你的场景中,你可以监控e.OriginalSource的值,当你进入最后一个控件时,你可以通过按Tab获得焦点。键,KeyDown事件将被触发两次。在第二个触发器中,e.OriginalSource的值可以是Windows.UI.Xaml.Controls.Frame(可能不同,取决于您在第二个触发器中的观察结果)。这是因为路由的KeyDown事件此时需要冒泡到它的父对象。您可以添加一些代码来标识第二个触发器。

例如:

private void Content_KeyDown(object sender, KeyRoutedEventArgs e)
{
if (e.OriginalSource.ToString()!= "Windows.UI.Xaml.Controls.Frame")
{
//Just be fired once here
}
}

注意,您可以尝试使用代码e.Handled = true;来停止此处引用的路由行为。并且,如果您使用Page.KeyDown事件,则不会触发两次KeyDown事件。

最新更新