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

时间:2021-01-28 07:10:52

标签: c# uwp uwp-xaml

我尝试过的是什么?

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

我正在开发 UWP 应用程序。在我的应用程序中 Window.Current.CoreWindow keydown 事件为键盘中除“Tab”键之外的所有键触发。

我不知道为什么该特定键不会触发事件?我想在按下“Tab”键时执行一些操作。任何人都知道,如何在按下“Tab”键时触发事件?

1 个答案:

答案 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 事件被触发两次的情况。