我尝试过的是什么?
Window.Current.CoreWindow.KeyDown += keydown;
private void keydown(CoreWindow sender, KeyEventArgs args)
{
//Printing entered key
}
我正在开发 UWP 应用程序。在我的应用程序中 Window.Current.CoreWindow keydown 事件为键盘中除“Tab”键之外的所有键触发。
我不知道为什么该特定键不会触发事件?我想在按下“Tab”键时执行一些操作。任何人都知道,如何在按下“Tab”键时触发事件?
答案 0 :(得分:1)
通过测试,当有一些控件如CoreWindow.KeyDown
可以在页面中获得焦点时,有时按Tab键不会触发Button
事件处理程序。您可以尝试将 UIElement.KeyDown 事件或 UIElement.PreviewKeyDown 事件添加到 xaml 文件中的页面(例如 MainPage
)。
更新:
当您使用 CoreWindow.KeyDown
事件并且有可以在页面中获得焦点的控件时,按 Tab 键将使焦点进入一个 Tab 序列,而不是触发 {{1 }} 事件。当按下 Tab 键并且焦点位于最后一个可以获得焦点的控件时,可能会触发 CoreWindow.KeyDown
事件。
如果您希望在按下 Tab 键时触发 CoreWindow.KeyDown
事件,您可以在页面中将 CoreWindow.KeyDown
设置为 TabNavigation
。如果您想保存 Tab 键进入 Tab 序列的功能,我们仍然建议您使用 Once
事件或 UIElement.KeyDown
事件。
例如:
UIElement.PreviewKeyDown
更新:
Window.Current.Content.KeyDown += Content_KeyDown;
事件是路由事件。关于路由事件,可以参考document。路由事件是可能从子对象传递(路由)到对象树中的每个连续父对象的事件。
在您的场景中,您可以监控 Window.Current.Content.KeyDown
的值,当您进入最后一个可以通过按 Tab 键获得焦点的控件时,您可以查看 {{1} } 事件将被触发两次。在第二个触发器中,e.OriginalSource
的值可能是 KeyDown
(可能不同,取决于您在第二个触发器中的观察)。这是因为路由的 e.OriginalSource
事件此时需要冒泡到其父对象。您可以添加一些代码来识别第二个触发器。
例如:
Windows.UI.Xaml.Controls.Frame
注意,您可以尝试使用代码 KeyDown
来停止引用 here 的路由行为。并且,如果使用 private void Content_KeyDown(object sender, KeyRoutedEventArgs e)
{
if (e.OriginalSource.ToString()!= "Windows.UI.Xaml.Controls.Frame")
{
//Just be fired once here
}
}
事件,则不会出现 KeyDown 事件被触发两次的情况。