取消整个应用程序中uwp控件上的空格键单击/点击

时间:2018-09-27 17:29:38

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

当UI元素(控件)集中在uwp应用程序中时,可以使用空格键 Enter 键触发它,这不仅限于桌面,而且还可以在Xbox中使用,因此用户可以浏览这些控件并按任意集中的控件以激活其Command

用例

但是在我的用例中,我只希望使用 Enter 键来触发该行为,并且无论在屏幕上按下哪个控件,空格键都不应该执行任何操作。 / p>

达到此要求的原因是,我正在构建一个MediaPlayer应用程序,并且当我按 Spacebar 时,无论应用程序中的焦点是哪个控件或按钮,我都希望将其链接到我的媒体元素的播放/暂停行为。

不重复

此问题不是以下内容的重复:UWP - Don't fire Click event when pressing space (like in Movies & TV app)

因为在上面链接的问题中,答案只有在AppBarButtons中的任何一个都集中时才有意义,因此它们在按 Space 时将不做任何操作,而只会使用输入。但是在我的用例中,我想甚至在MediaPlayerElement控件之外也应用相同的行为。我有一个NavigationView,并且MediaPlayerElement驻留在其中一个页面中,所以即使在NavigationViewItem处于焦点状态或任何其他可以焦点并被调用的控件上,我也希望这种行为有效被 Enter 而不是 Space 调用。

是否有应用程序级别的解决方案,可以在根控件上应用此行为,并将其应用于所有子项,即整个应用程序?

我尝试过的事情

我已经尝试了已经回答的问题(上面链接),并且在有限的情况下可以正常工作。而且,我还尝试将AllowFocusOnInteraction=false设置为每个应用栏按钮以及其他CustomMediaTransportControls风格的其他控件。但这也仅限于MediaPlayerElement,并且它还阻止了选项卡导航,这不利于可访问性。

2 个答案:

答案 0 :(得分:2)

您可以通过在可视树层次结构中(例如,在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事件会在事件发生之前传播树。

答案 1 :(得分:1)

有很多方法可以解决,您可以侦听当前的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,当应用程序的窗口不在前台时可以使用。有关更多出轨的信息,请检查此blog