wpf 菜单项的键盘快捷键

问题描述 投票:0回答:3

我正在尝试使用

在我的 xaml 代码中向菜单项添加键盘快捷键
<MenuItem x:Name="Options" Header="_Options" InputGestureText="Ctrl+O" Click="Options_Click"/>

Ctrl+O

但它不起作用 - 它没有调用“单击”选项。

有什么解决办法吗?

c# wpf keyboard-shortcuts menuitem
3个回答
8
投票

InputGestureText
只是一条文字。它不会将密钥绑定到
MenuItem

该属性不会将输入手势与菜单项关联起来;它只是将文本添加到菜单项。应用程序必须处理用户的输入才能执行操作

您可以做的是使用指定的输入手势在窗口中创建

RoutedUICommand

public partial class MainWindow : Window
{
    public static readonly RoutedCommand OptionsCommand = new RoutedUICommand("Options", "OptionsCommand", typeof(MainWindow), new InputGestureCollection(new InputGesture[]
        {
            new KeyGesture(Key.O, ModifierKeys.Control)
        }));

    //...
}

然后在 XAML 中将该命令绑定到某个方法,根据

MenuItem
设置该命令。在这种情况下,
InputGestureText
Header
都将从
RoutedUICommand
中拉出,因此您无需将其设置为针对
MenuItem

<Window.CommandBindings>
    <CommandBinding Command="{x:Static local:MainWindow.OptionsCommand}" Executed="Options_Click"/>
</Window.CommandBindings>
<Menu>
    <!-- -->
    <MenuItem Command="{x:Static local:MainWindow.OptionsCommand}"/>
</Menu>

1
投票

你应该这样成功: 定义菜单项快捷方式 通过使用按键绑定:

<Window.CommandBindings> <CommandBinding Command="New" Executed="CommandBinding_Executed" /> </Window.CommandBindings> <Window.InputBindings> <KeyBinding Key="N" Modifiers="Control" Command="New"/> </Window.InputBindings>

0
投票

我意识到这篇文章很旧,但这是一个常青问题,所以这是我发现的最简单的方法。

XAML:

<Window BLAH BLAH BLAH>
    <Grid x:Name="MainGrid">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/> <!-- menu -->
            <RowDefinition Height="*"/> <!-- other stuff -->
        </Grid.RowDefinitions>
    
        <!-- menu -->
        <Menu Grid.Row="0">
            <MenuItem x:Name="FileMenu" Header="_File">
                <MenuItem Header="Do the thing" Click="Do_Click"/>
                <MenuItem Header="Exit"  Click="Exit_Click"/>
            </MenuItem>
        </Menu>

        <!-- button that calls the same method -->
        <Button Click="Do_Click" Grid.Row="1">
            <Image Source="Resources/DoTheThing.png"/>
        </Button>
    </Grid>
</Window>

背后代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        
        //tied to menu item and button
        CreateCommand(ModifierKeys.Control, Key.N, Do_Click);
        
        //tied to menu item only
        CreateCommand(ModifierKeys.Alt, Key.F4, Exit_Click);
        
        //key press only
        CreateCommand(ModifierKeys.None, Key.F2, F2_Handler);
    }
    
    private void CreateCommand(ModifierKeys modifier, Key key, ExecutedRoutedEventHandler method)
    {
        var cmd = new RoutedCommand();
        cmd.InputGestures.Add(new KeyGesture(key, modifier));
        CommandBindings.Add(new CommandBinding(cmd, method));
    }
    
    private void Do_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Doing the thing");
    }
    
    private void Exit_Click(object sender, RoutedEventArgs e)
    {
        Application.Current.Shutdown();
    }
    
    private void F2_Handler(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("F2");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.