当UI元素(控件)集中在uwp应用程序中时,可以使用空格键或 Enter 键触发它,这不仅限于桌面,而且还可以在Xbox中使用,因此用户可以浏览这些控件并按任意集中的控件以激活其Command
。
用例
但是在我的用例中,我只希望使用 Enter 键来触发该行为,并且无论在屏幕上按下哪个控件,空格键都不应该执行任何操作。 / p>
达到此要求的原因是,我正在构建一个MediaPlayer
应用程序,并且当我按 Spacebar 时,无论应用程序中的焦点是哪个控件或按钮,我都希望将其链接到我的媒体元素的播放/暂停行为。
不重复
此问题不是以下内容的重复:UWP - Don't fire Click event when pressing space (like in Movies & TV app)
因为在上面链接的问题中,答案只有在AppBarButtons
中的任何一个都集中时才有意义,因此它们在按 Space 时将不做任何操作,而只会使用输入。但是在我的用例中,我想甚至在MediaPlayerElement
控件之外也应用相同的行为。我有一个NavigationView
,并且MediaPlayerElement
驻留在其中一个页面中,所以即使在NavigationViewItem
处于焦点状态或任何其他可以焦点并被调用的控件上,我也希望这种行为有效被 Enter 而不是 Space 调用。
是否有应用程序级别的解决方案,可以在根控件上应用此行为,并将其应用于所有子项,即整个应用程序?
我尝试过的事情
我已经尝试了已经回答的问题(上面链接),并且在有限的情况下可以正常工作。而且,我还尝试将AllowFocusOnInteraction=false
设置为每个应用栏按钮以及其他CustomMediaTransportControls
风格的其他控件。但这也仅限于MediaPlayerElement
,并且它还阻止了选项卡导航,这不利于可访问性。
答案 0 :(得分:2)
您可以通过在可视树层次结构中(例如,在PreviewKeyDown
中处理更高级别的Page
事件来做到这一点。
在Page
构造函数中订阅事件:
public MainPage()
{
this.InitializeComponent();
this.PreviewKeyDown += MainPage_PreviewKeyDown;
}
或在XAML中:
<Page ... PreviewKeyDown="MainPage_PreviewKeyDown">
然后在事件处理程序中,将KeyRoutedEventArgs
设置为在按下 Space 键时进行处理:
private void MainPage_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
{
if (e.Key == VirtualKey.Space)
{
e.Handled = true;
}
}
这样,按下键事件将永远不会到达层次结构中的任何控件之下,因为PreviewKeyDown
事件会在事件发生之前传播树。
答案 1 :(得分:1)
有很多方法可以解决,您可以侦听当前的Content
PreviewKeyDown
事件来检测 Space 的按下情况。
public Scenario1()
{
this.InitializeComponent();
Window.Current.Content.PreviewKeyDown += Content_PreviewKeyDown;
}
private void Content_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
{
e.Handled = e.Key == VirtualKey.Space ? true : false;
}
您还可以为uwp应用程序使用GLOBAL HOTKEY,当应用程序的窗口不在前台时可以使用。有关更多出轨的信息,请检查此blog。