取消空格键 在整个应用中单击/点击 uwp 控件



当UI元素(控件(在uwp应用程序中聚焦时,可以使用空格键Enter键触发它,这不仅限于桌面,而且在Xbox中也有帮助,因此用户可以浏览控件并按任何聚焦控件以激活其Command

用例

但是在我的用例中,我只想输入键来触发该行为,无论在屏幕上按下哪个控件,空格都不应该做任何事情。

此要求的原因是我正在构建一个MediaPlayer应用程序,无论按空格键时应用程序内的哪个控件或按钮聚焦,我都只想将其链接到媒体元素的播放/暂停行为。

不是重复的

此问题不是以下内容的副本: UWP - 按下空格时不触发单击事件(如在电影和电视应用中(

因为在上面链接的问题中,答案仅在任何AppBarButtons被聚焦时才有意义,因此它们不会在按空格键时执行任何操作,而只会使用Enter调用。但在我的用例中,我想即使在MediaPlayerElement控件之外也应用相同的行为。我有一个NavigationViewMediaPlayerElement驻留在其中一个页面中,所以我希望即使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事件在事件发生之前传播树。

有很多方法可以接近, 您可以收听当前ContentPreviewKeyDown事件来检测空格键。

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 应用提供全局热键,当应用的窗口不在前台时可以使用该键。有关更多脱轨,您可以查看此博客。

最新更新