如何在WPF ContextMenu中以编程方式添加访问键(快捷键)?

5

我已经有以下内容:

var myContextMenu = new System.Windows.Controls.ContextMenu();

var exitItem = new MenuItem();
exitItem.Header = "E_xit";
exitItem.Item.Click += new RoutedEventHandler(new System.EventHandler(ExitProgram));
myContextMenu.Items.Add(exitItem);

这会导致我的上下文菜单显示带有下划线“x”的退出菜单项。但是,按下x没有任何反应。单击菜单项可以正常工作。如何将事件与x键关联?请注意,这必须在我的上下文中以编程方式完成。我不能在前端的XAML中组合此解决方案。

请查看ApplicationCommands类中已经内置的WPF命令是否可用:http://msdn.microsoft.com/zh-cn/library/system.windows.input.applicationcommands.aspx - S2S2
2个回答

3
通常添加快捷方式的方法如下:
var exitCommand = new RelayCommand(_ => ExitProgram());
        var exitItem = new MenuItem(); 
        exitItem.Header = "E_xit";
        exitItem.Command = exitCommand;
        myContextMenu.Items.Add(exitItem);

        InputBindings.Add(new KeyBinding(exitCommand, new KeyGesture(Key.X, ModifierKeys.Alt));

这里使用的RelayCommand类不是WPF的一部分,但在基于MVVM的应用程序中广泛使用。

请注意,您不能将快捷方式设置为X而没有修饰符。引自MSDN

在大多数情况下,KeyGesture必须与一个或多个ModifierKeys关联。例外情况是功能键和数字键盘键,它们可以单独成为有效的KeyGesture。例如,您可以仅使用F12键创建KeyGesture,但要使用X键作为KeyGesture,必须将其与修饰键配对。

如果出于某种原因需要在没有修饰符的情况下使用X,则必须处理键盘事件(例如KeyDown)并相应地做出反应。


在Windows中看到菜单(上下文菜单或文件菜单等)使用没有修饰符的热键非常普遍。这些都是使用键盘事件吗? - Jordan Morris
无法确定,至少在WPF中使用InpupBindings不可能实现。无论如何,使用键盘事件很容易实现:private void mainWindow_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e) { if (e.Key == System.Windows.Input.Key.X) App.Current.Shutdown(); } - olldman

0

这对我来说很好用:

using System.Windows;
using System.Windows.Controls;

namespace WpfApplication5
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(MainWindow_Loaded);
        }

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            // Create menu item.
            MenuItem exitMenuItem = new MenuItem();
            exitMenuItem.Header = "E_xit";
            exitMenuItem.Click +=new RoutedEventHandler(exitMenuItem_Click);

            // Create contextual menu.
            ContextMenu contextMenu = new ContextMenu();
            contextMenu.Items.Add(exitMenuItem);

            // Attach context-menu to something.
            myButton.ContextMenu = contextMenu; // Assuming there's a button on window named "myButton".
        }

        public void exitMenuItem_Click(object sender, RoutedEventArgs e)
        {
            // This gets executed when user right-clicks button, and presses x down on their keyboard.
            // TODO: Exit logic.
        }
    }
}


<Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow">
    <Grid>
        <Button x:Name="myButton" />
    </Grid>
</Window>

当用户右键单击按钮并在键盘上按“x”时,将执行exitMenuItem_Click处理程序。您没有看到这种情况发生吗?

1
正确,我没有看到这个。值得注意的是,在我的上下文中没有窗口。我正在为系统托盘图标创建一个上下文菜单。 - Jordan Morris

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