我希望检测键盘上的按键,以执行命令。因此,当我按下 F
键时,会执行某个动作。我该如何实现?
KeyDown
,这些事件会在每次按下或释放按键时提供给你。public void MyKeyDownEventHandler(object sender, KeyRoutedEventArgs e)
{
if (e.Key == 70)
{
MessageBox.Show("'F' key pressed");
}
}
KeyDown
事件绑定到控件上,只有在控件有焦点时才会触发该事件,因此您需要考虑从哪个控件触发该事件。为了使事件在应用程序的任何地方都能触发,这篇博客文章 提供了一个巧妙的解决方案:
在应用程序启动时将 KeyDown
事件注册到所有控件,只要您的应用程序处于焦点状态,它就会一直触发,因为始终有一个控件处于焦点状态。要实现这一点,请将以下代码添加到您的应用程序的 OnStartup()
方法中(位于 app.xaml.cs 中):
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
EventManager.RegisterClassHandler(typeof(Control),
Control.KeyDownEvent,
new KeyEventHandler(MyKeyDownEventHandler));
base.OnStartup(e);
}
}
OnStartup
方法仅在应用程序启动时调用。然后,每当按下键(同时您的 UI 中的任何控件具有焦点),都会触发 KeyDownEvent
,从而调用您的 MyKeyDownEventHandler
。 - FelixKeyboardAccelerator
添加到MenuFlyoutItem
的KeyboardAccelerators
集合中来附加键盘加速器。ContentPage.MenuBarItems
中。<!-- MainPage.xaml -->
<ContentPage>
<ContentPage.MenuBarItems>
<MenuBarItem Text="File">
<MenuFlyoutItem Text="F" Clicked="MenuFlyoutItem_Clicked">
<MenuFlyoutItem.KeyboardAccelerators>
<KeyboardAccelerator Key="F" />
</MenuFlyoutItem.KeyboardAccelerators>
</MenuFlyoutItem>
</MenuBarItem>
</ContentPage.MenuBarItems>
</ContentPage>
// MainPage.xaml.cs
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
private void MenuFlyoutItem_Clicked(object sender, EventArgs e)
{
Debug.WriteLine($"MenuFlyoutItem {((MenuFlyoutItem)sender).Text} clicked");
}
}
https://learn.microsoft.com/en-us/dotnet/maui/user-interface/keyboard-accelerators?view=net-maui-8.0
请明确你使用的是 Xamarin 还是 Maui,它们之间也有一些区别,关于 MauiProgram.cs。我认为它覆盖了 OnStartup 替换 MauiProgram.cs。那么,在这里解决或找到 Maui 中 KeyDown 事件答案的朋友们呢?THE ToolMakerSteven,我不知道他是谁,但他说可能要等到 .net 8 才行...