在WPF中创建带有快捷方式的菜单的正确方法

3
什么是创建带有热键快捷方式菜单的正确/最佳方法?
我只想要一个类似于Visual Studio的文件菜单,其中包括新建、打开、保存、全部保存、退出等几个标准快捷键。
似乎InputGestureText显示了适当的文本,但由于它被称为“文本”并且似乎不会触发事件,所以我会假设这不是正确的方法。如果有更好的方法,那么Command结构似乎也相当笨重,因此我不想走这条路。
更新: 为了清晰起见,假设我正在使用以下菜单:
<Menu>
  <MenuItem Header="_File">
    <MenuItem Header="_New" />
    <MenuItem Header="_Open" />
    <Separator />
    <MenuItem Header="_Save" />
    <MenuItem Header="Save _All" />
    <Separator />
    <MenuItem Header="_Export"/>
    <MenuItem Header="_Import"/>
    <Separator />
    <MenuItem Header="E_xit"/>
  </MenuItem>
</Menu>

在这里,“导出”和“导入”将成为自定义快捷方式;这是微软没有像ApplicationCommands那样内置的功能。请您提供完整的解决方案,包括必要的C#自定义代码吗?这不仅可以帮助我解决问题,也可以帮助其他搜索类似问题的人。

2个回答

13
您提到InputGestureText并不会设置快捷键,它只是在菜单中将其标记出来。正确的方法是使用窗口的InputBindings属性来设置快捷键,您可以将任何命令,包括自定义命令,映射到快捷键。但要使其生效,您需要使用绑定到命令的菜单项,而不是直接处理它们的click事件。这是WPF处理菜单命令的推荐方式。否则,您将需要使用传统的键盘事件处理方式。
<Window.InputBindings>
  <KeyBinding Key="A" Modifiers="Control" Command="{Binding MyAwesomeCommand}" />
</Window.InputBindings>

在MSDN上了解更多信息。


嗯,这是一种将自定义快捷方式连接到自定义命令的新方法。虽然它并没有完全让我满意,但MSDN链接非常有帮助。 - Matt DeKrey
InputBinding 可以让用户通过键盘快捷键来调用命令。要在菜单中显示快捷方式,只需将 InputGestureText 属性添加到相应的菜单中即可:<MenuItem Header="_新建" InputGestureText="Ctl+N"/> - mrfelis

4
请看一下ApplicationCommands类。您可以免费获取标准的键盘手势(加速键)和文本。
<MenuItem Command="ApplicationCommands.Paste" Width="75" />

当我将此添加到我的应用程序中时,即使用户聚焦于文本框并可以实际复制和粘贴,菜单项也会被禁用。另外,自定义命令需要做什么? - Matt DeKrey
@matt 对的,每个命令都是一个Execute + CanExecute组合。如果CanExecute评估为false,则菜单项将被禁用。例如,如果还没有复制任何内容,则PasteCmd.CanExecute将返回false(使菜单项变灰)。有关自定义命令,请参见http://msdn.microsoft.com/en-us/library/system.windows.input.routedcommand.aspx。 - Gishu

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