我正在尝试使用
在我的 xaml 代码中向菜单项添加键盘快捷键<MenuItem x:Name="Options" Header="_Options" InputGestureText="Ctrl+O" Click="Options_Click"/>
与 Ctrl+O
但它不起作用 - 它没有调用“单击”选项。
有什么解决办法吗?
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>
你应该这样成功: 定义菜单项快捷方式 通过使用按键绑定:
<Window.CommandBindings> <CommandBinding Command="New" Executed="CommandBinding_Executed" /> </Window.CommandBindings> <Window.InputBindings> <KeyBinding Key="N" Modifiers="Control" Command="New"/> </Window.InputBindings>
我意识到这篇文章很旧,但这是一个常青问题,所以这是我发现的最简单的方法。
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");
}
}