当 UI 元素(控件)在 uwp 应用程序中获得焦点时,可以使用 Spacebar 或 Enter 键触发,这不仅限于桌面,还有助于在 Xbox 中,因此用户可以浏览控件并按下任何聚焦控件以激活其 Command
。
用例
但在我的用例中,我只需要 Enter 键来触发该行为,而无论在屏幕上按下哪个控件,Spacebar 都不应该做任何事情。
此要求的原因是我正在构建一个 MediaPlayer
应用程序,无论当我按下 Spacebar 时应用程序中哪个控件或按钮处于焦点,我只想简单地将其链接到我的媒体元素的播放/暂停行为。
不是重复的
此问题不是以下问题的重复:UWP - Don't fire Click event when pressing space (like in Movies & TV app)
因为在上面链接的问题中,答案仅在任何 AppBarButtons
被聚焦时才相关,因此它们不会在按下 Space 时执行任何操作,但只会被调用使用 Enter。但在我的用例中,我想在 MediaPlayerElement
控件之外应用相同的行为。我有一个 NavigationView
并且 MediaPlayerElement
驻留在其中一个页面中,所以我希望即使在 NavigationViewItem
被聚焦或任何其他情况下,这种行为也能起作用可以聚焦和调用的控件只能使用 Enter 而不是 Space 调用。
是否有一个应用程序级别的解决方案,我可以在最根控件上应用此行为并将其下降到它的所有子控件,即:整个应用程序?
我尝试过的
我已经尝试过已经回答的问题(上面链接),并且在有限的情况下效果很好。我还尝试将 AllowFocusOnInteraction=false
设置为每个应用栏按钮以及我在 CustomMediaTransportControls
样式中拥有的其他额外控件。但这也仅限于 MediaPlayerElement
并且它还阻止了不利于可访问性的选项卡导航。
最佳答案
您可以通过处理可视化树层次结构中更高层的 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
事件会在事件发生之前传播树。
关于c# - 在整个应用程序中取消空格键单击/点击 uwp 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52542270/