在整个应用程序中取消 uwp 控件上的空格键 Click/Tap

Canceling the SpaceBar Click/Tap on uwp controls throughout the app

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

用例

但在我的用例中,我只想要 Enter 键来触发该行为,而 Spacebar 不应该做任何事情无论按下屏幕上的哪个控件。

这个要求的原因是我正在构建一个 MediaPlayer 应用程序,当我按下 Spacebar 我想简单地 link 它到我的媒体元素的 Play/Pause 行为。

不是重复的

此问题与以下问题不重复:

因为在上面的问题 linked 中,答案仅在 AppBarButtons 中的任何一个被聚焦时才相关,因此他们在按下 [=70= 时不会做任何事情],但只会用 Enter 调用。但在我的用例中,我想在 MediaPlayerElement 控件之外应用相同的行为。我有一个 NavigationView 并且 MediaPlayerElement 驻留在其中一个页面中,所以我希望这种行为即使在 NavigationViewItem 被聚焦或任何其他可以聚焦和调用的控件应该只使用 Enter 而不是 Space 调用。

是否有一个应用程序级别的解决方案,我可以在最根控件上应用此行为并将其下降到它的所有子控件,即:整个应用程序?

我试过的

我已经尝试过已经回答过的问题(linked 以上)并且在有限的情况下效果很好。而且我还尝试将 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 事件会在事件发生之前传播树。

有很多方法可以解决,你可以监听当前的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,当您的应用程序 window 不在前台时可以使用它。如需更多出轨,您可以查看此 blog .