当我执行输入手势时,为什么不设置MenuItem.InputGestureText会导致MenuItem激活?
我想为MenuItem
实现键盘快捷键。 我使用过以下代码:
`
但是当我按下CTRL+N
时, InputGestureText
属性没有响应。 我正在使用Visual Studio Express Edition 2010.我在这里遗漏了什么吗?
该属性的文档中非常明确:
此属性不会将输入手势与菜单项相关联; 它只是将文本添加到菜单项。 应用程序必须处理用户的输入以执行操作。 有关如何将命令与菜单项关联的信息,请参阅命令 。
执行此操作的最佳方法是创建一个Command
,并将InputGesture
与该命令相关联:
public static class Commands { public static readonly RoutedCommand CreateNew = new RoutedCommand("New", typeof(Commands)); static Commands() { SomeCommand.InputGestures.Add(new KeyGesture(Key.N, ModifierKeys.Control)); } } ... // Wherever you want to create the MenuItem. "local" should be the namespace that // you delcared "Commands" in.
如果您真的只想要一个“新”命令,则可以跳过创建RoutedCommand
和InputGesture
,因为已经为您创建了该命令:
一个不涉及命令和绑定的解决方案是覆盖拥有Window的OnKeyDown
方法并搜索具有与键盘事件匹配的KeyGesture
的菜单项。
这是Window的OnKeyDown覆盖的代码:
protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown(e); // here I suppose the window's menu is named "MainMenu" MainMenu.RaiseMenuItemClickOnKeyGesture(e); }
以下是将菜单项与键盘事件匹配的实用程序代码:
public static void RaiseMenuItemClickOnKeyGesture(this ItemsControl control, KeyEventArgs args) => RaiseMenuItemClickOnKeyGesture(control, args, true); public static void RaiseMenuItemClickOnKeyGesture(this ItemsControl control, KeyEventArgs args, bool throwOnError) { if (args == null) throw new ArgumentNullException(nameof(args)); if (control == null) return; var kgc = new KeyGestureConverter(); foreach (var item in control.Items.OfType