如何检测键盘输入?

3

我希望检测键盘上的按键,以执行命令。因此,当我按下 F 键时,会执行某个动作。我该如何实现?


请翻译以下与编程有关的内容,从英文到中文。仅返回已翻译的文本:像这样https://stackoverflow.com/questions/57181132/keypress-event-on-xamarin-forms - Bas H
3个回答

4
你需要处理键盘事件,例如 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);
    }
}

谢谢,但是 MAUI 不认识 KeyRoutedEventArgs,或者我无法将其放入 viewModel 中。 - Emma
你是否缺少任何using指令? - Felix
System.Windows.Input是什么? - Emma
OnStartup 方法仅在应用程序启动时调用。然后,每当按下键(同时您的 UI 中的任何控件具有焦点),都会触发 KeyDownEvent,从而调用您的 MyKeyDownEventHandler - Felix
我遇到了错误 CS0246,无法找到类型或命名空间名称为 'KeyRoutedEventArgs'(您是否缺少使用指令或程序集引用?) - Emma
显示剩余5条评论

0
键盘加速器在MAUI .NET 8中。可以通过将KeyboardAccelerator添加到MenuFlyoutItemKeyboardAccelerators集合中来附加键盘加速器。
可以按照以下方式将其添加到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


0

请明确你使用的是 Xamarin 还是 Maui,它们之间也有一些区别,关于 MauiProgram.cs。我认为它覆盖了 OnStartup 替换 MauiProgram.cs。那么,在这里解决或找到 Maui 中 KeyDown 事件答案的朋友们呢?THE ToolMakerSteven,我不知道他是谁,但他说可能要等到 .net 8 才行...


对于非答案反馈,请发表评论而不是回答。 - SpicyCatGames
是的,我在这里写东西还很新,谢谢。 - simone
这并没有回答问题。一旦你拥有足够的声望,你就可以评论任何帖子; 相反,提供不需要询问者澄清的答案。- 来自审核 - qqtf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接