当UI元素(控件(在uwp应用程序中聚焦时,可以使用空格键或Enter键触发它,这不仅限于桌面,而且在Xbox中也有帮助,因此用户可以浏览控件并按任何聚焦控件以激活其Command
。
用例
但是在我的用例中,我只想输入键来触发该行为,无论在屏幕上按下哪个控件,空格键都不应该做任何事情。
此要求的原因是我正在构建一个MediaPlayer
应用程序,无论按空格键时应用程序内的哪个控件或按钮聚焦,我都只想将其链接到媒体元素的播放/暂停行为。
不是重复的
此问题不是以下内容的副本: UWP - 按下空格时不触发单击事件(如在电影和电视应用中(
因为在上面链接的问题中,答案仅在任何AppBarButtons
被聚焦时才有意义,因此它们不会在按空格键时执行任何操作,而只会使用Enter调用。但在我的用例中,我想即使在MediaPlayerElement
控件之外也应用相同的行为。我有一个NavigationView
,MediaPlayerElement
驻留在其中一个页面中,所以我希望即使NavigationViewItem
被聚焦或任何其他可以聚焦和调用的控件也只能使用Enter而不是Space调用,此行为也能正常工作。
是否有应用程序级别的解决方案,我可以在根控件中应用此行为,并将其下降到其所有子级,即:整个应用程序?
我试过什么
我已经尝试了已经回答的问题(上面链接(,并且适用于其有限的场景。我还尝试为每个应用栏按钮设置AllowFocusOnInteraction=false
,以及我CustomMediaTransportControls
风格的其他额外控件。但这也仅限于MediaPlayerElement
,并且还会阻止选项卡导航,这对可访问性不利。
您可以通过在可视化树层次结构中较高的位置(例如在Page
中(处理PreviewKeyDown
事件来执行此操作。
订阅Page
构造函数中的事件:
public MainPage()
{
this.InitializeComponent();
this.PreviewKeyDown += MainPage_PreviewKeyDown;
}
或者在 XAML 中:
<Page ... PreviewKeyDown="MainPage_PreviewKeyDown">
在事件处理程序中,将KeyRoutedEventArgs
设置为按下空格键时处理:
private void MainPage_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
{
if (e.Key == VirtualKey.Space)
{
e.Handled = true;
}
}
这样,键关闭事件将永远不会到达层次结构中下面的任何控件,因为PreviewKeyDown
事件在事件发生之前传播树。
有很多方法可以接近, 您可以收听当前Content
PreviewKeyDown
事件来检测空格键。
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 应用提供全局热键,当应用的窗口不在前台时可以使用该键。有关更多脱轨,您可以查看此博客。