我有以下场景:
具有多个ICommand(RelayCommand)属性的ViewModel。这些属性绑定到视图中的菜单项。一些菜单项应该有键盘快捷键。为此,我尝试使用窗口的InputBindings。这有效 - 但我必须手动将InputGestureText分配给MenuItem。所以我想有一种更好的方法将ICommand绑定到MenuItem并分配一个快捷方式......
// ViewModel
class MyViewModel: ViewModelBase {
public ICommand TestCommand {get; set;}
}
// View
<Window...>
<Window.InputBindings>
<KeyBinding Command="{Binding TestCommand}" Key="R" Modifiers="Control" />
</Window.InputBindings>
// ...
<MenuItem Name="MenuItemTest" Command="{Binding TestCommand}"
Header="Test" InputGestureText="Ctrl + R" />
</Window>
InputGestureText
属性仅用于设置描述输入手势的文本,该手势将调用与命令关联的命令。
它不会以某种方式将输入手势与菜单项相关联;它只是将文本添加到菜单项。这在MSDN上有记录:https://msdn.microsoft.com/en-us/library/system.windows.controls.menuitem.inputgesturetext(v=vs.110).aspx。
所以不,没有更好的办法做你正在做的事情:)
可能是我有点晚了,但是:
菜单项上的自动快捷键提示与RoutedCommand
一起使用。
public static readonly RoutedUICommand NewProject = new RoutedUICommand() { InputGestures = { new KeyGesture(Key.N, ModifierKeys.Control) } };
如果这样做 - 您将使热键正常工作(即使没有窗口中的输入绑定),您将在绑定到此命令的任何菜单项中看到此热键。这只适用于RoutedCommand
(类型在WPF源代码中是硬编码的)。如果你的命令不是RoutedCommand
(并且它不是,因为你使用ICommand
模式) - 你必须自己设置手势提示。
所以有两个选择:为它们使用RoutedCommand
和事件处理程序(在UI代码中!)或实现自己的命令,并使用快捷方式提示做任何事情。