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

时间:2012-06-11 14:19:29

标签: c# wpf menu shortcut

我已经拥有以下内容:

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中编写这个解决方案。

2 个答案:

答案 0 :(得分:2)

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

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   他们自己。例如,您可以仅使用。创建KeyGesture   F12键,但要在KeyGesture中使用X键,它必须与a配对   修饰键。

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

答案 1 :(得分: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处理程序。你没有看到这种情况发生吗?