c# - 在整个应用程序中取消空格键单击/点击 uwp 控件

标签 c# xaml uwp keyboard-shortcuts media-player

当 UI 元素(控件)在 uwp 应用程序中获得焦点时,可以使用 SpacebarEnter 键触发,这不仅限于桌面,还有助于在 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/

相关文章:

c# - 具有模板支持的 Windows Phone 自定义用户控件

Xamarin.Forms UWP - 如何将应用程序锁定为横向

listview - 更改 ListView 的 ItemPanelTemplate 方向

c# - asp.net的特点

c# - SQL 脚本数据中的关键字在以编程方式执行时导致问题 - C#

C# 7 模式匹配

c# - 将 C# 中的变量数据绑定(bind)到 WPF 应用程序中的文本 block 不起作用

xaml - 是否可以在 VisualState 中缩放控件

win-universal-app - Application.Current.Exit() 和 OnSuspendingEvent

c# - 如何从整数列表中计算排名?