在整个应用程序中取消 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 .
当 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 .