如何以编程方式将访问密钥(快捷方式)添加到WPF ContextMenu?

我已经有以下内容:

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); 

这会导致我的上下文菜单显示Exit菜单项,带有带下划线的“x”。 但是,按x不会做任何事情。 单击菜单项工作正常。

如何将事件与x键关联? 请注意,这必须在我的上下文中以编程方式完成。 我不能在前面的XAML中编写这个解决方案。

添加快捷方式的常用方法如下:

 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相关联。 此规则的例外情况是function键和数字小键盘键,它们本身可以是有效的KeyGesture。 例如,您可以仅使用F12键创建KeyGesture,但要在KeyGesture中使用X键,它必须与修饰键配对。

如果由于某种原因你需要使用X w / o修饰符 – 你将不得不处理键盘事件(例如KeyDown)并做出相应的反应

这对我来说很好:

 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. } } }      

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