Window.Current.CoreWindow KeyDown 事件不会触发 "Tab" 在 c# 中按下的键?
Window.Current.CoreWindow KeyDown Event won't fire for "Tab" key Pressed in c#?
我试过的是什么?
Window.Current.CoreWindow.KeyDown += keydown;
private void keydown(CoreWindow sender, KeyEventArgs args)
{
//Printing entered key
}
我正在开发 UWP application.In 我的应用 Window.Current.CoreWindow
为键盘中除“Tab”键之外的所有键触发的 keydown 事件。
我不知道为什么没有针对该特定键触发事件?我想在按下“Tab”键时执行一些操作。任何人都知道,如何在按下“Tab”键时触发事件?
经测试,当页面中有Button
等控件可以获得焦点时,有时按Tab键不会触发CoreWindow.KeyDown
事件处理程序.您可以尝试将 UIElement.KeyDown event or a UIElement.PreviewKeyDown 事件添加到 xaml 文件中的页面(例如 MainPage
)。
更新:
当您使用 CoreWindow.KeyDown
事件并且有控件可以在您的页面中获得焦点时,按 Tab 键将使焦点进入 Tab 序列而不是触发 CoreWindow.KeyDown
事件。当按下Tab键并且焦点位于最后一个可以获得焦点的控件时,可以触发CoreWindow.KeyDown
事件。
如果你想在按下Tab键时触发CoreWindow.KeyDown
事件,你可以在页面中将TabNavigation
设置为Once
.如果你想保留Tab键进入Tab序列的功能,我们仍然建议你使用UIElement.KeyDown
事件或UIElement.PreviewKeyDown
事件。
例如:
Window.Current.Content.KeyDown += Content_KeyDown;
更新:
Window.Current.Content.KeyDown
事件是路由事件。关于路由事件,可以参考document。路由事件是可能从子对象传递(路由)到对象树中其每个连续父对象的事件。
在您的场景中,您可以监视 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;
来停止引用 here 的路由行为。而且,如果使用Page.KeyDown
事件,不会出现KeyDown事件被触发两次的情况。
我试过的是什么?
Window.Current.CoreWindow.KeyDown += keydown;
private void keydown(CoreWindow sender, KeyEventArgs args)
{
//Printing entered key
}
我正在开发 UWP application.In 我的应用 Window.Current.CoreWindow 为键盘中除“Tab”键之外的所有键触发的 keydown 事件。
我不知道为什么没有针对该特定键触发事件?我想在按下“Tab”键时执行一些操作。任何人都知道,如何在按下“Tab”键时触发事件?
经测试,当页面中有Button
等控件可以获得焦点时,有时按Tab键不会触发CoreWindow.KeyDown
事件处理程序.您可以尝试将 UIElement.KeyDown event or a UIElement.PreviewKeyDown 事件添加到 xaml 文件中的页面(例如 MainPage
)。
更新:
当您使用 CoreWindow.KeyDown
事件并且有控件可以在您的页面中获得焦点时,按 Tab 键将使焦点进入 Tab 序列而不是触发 CoreWindow.KeyDown
事件。当按下Tab键并且焦点位于最后一个可以获得焦点的控件时,可以触发CoreWindow.KeyDown
事件。
如果你想在按下Tab键时触发CoreWindow.KeyDown
事件,你可以在页面中将TabNavigation
设置为Once
.如果你想保留Tab键进入Tab序列的功能,我们仍然建议你使用UIElement.KeyDown
事件或UIElement.PreviewKeyDown
事件。
例如:
Window.Current.Content.KeyDown += Content_KeyDown;
更新:
Window.Current.Content.KeyDown
事件是路由事件。关于路由事件,可以参考document。路由事件是可能从子对象传递(路由)到对象树中其每个连续父对象的事件。
在您的场景中,您可以监视 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;
来停止引用 here 的路由行为。而且,如果使用Page.KeyDown
事件,不会出现KeyDown事件被触发两次的情况。