2012-08-25 34 views
3

我有一个Windows窗体显示为模型对话框。它有一个类ContextMenuStrip的上下文菜单。我在快捷菜单中设置了几个项目的快捷方式。但是这个快捷键只有在显示上下文菜单时才起作用。即使上下文菜单未激活,如何使它们工作?从上下文菜单中处理快捷方式

我知道的唯一方法是处理表格的KeyPress事件,递归遍历上下文菜单中的所有项目,并将其ShortcutKeys属性与按下的实际按键进行比较。如果匹配,请手动为此项目致电OnClick事件。任何更好的想法?

+0

好吧,我不知道为什么,当上下文菜单没有被激活的快捷方式不起作用,而是一个建议,当你处理按键事件,您确定组合键,只需调用与组合键相关的功能即可。为什么要以编程方式迭代contextmenus? –

+0

因为这允许我避免代码重复。我想在菜单中有快捷方式,所以我必须在那里指定它们,并且必须在那里设置处理程序。这应该是我指定的唯一地方。 – Mikhail

+0

我可以给你的一个建议是,尝试使用ctrl键生成shourtcut并查看菜单关闭时它是否正常工作? –

回答

1

最后,我实现了手动迭代的KeyPressed事件处理程序:

Action<ToolStripMenuItem> check_shortcut = null; 

    check_shortcut = (node) => 
    { 
    if (node.ShortcutKeys == e.KeyData) 
    { 
     node.PerformClick(); 
    } 
    foreach (ToolStripMenuItem child in node.DropDownItems) 
    { 
     check_shortcut(child); 
    } 
    }; 

    foreach (ToolStripMenuItem item in MyContextMenuStrip.Items) 
    { 
    check_shortcut(item); 
    } 
+0

我编辑了你的答案:一些更正,正确的事件是KeyDown。在foreach中,您需要检查对象是否是ToolStripMenuItem,因为如果它是分隔符,则会引发异常。 – Pedro77

+0

也许你必须在窗体上设置'KeyPreview = true;'来确保检查所有的KeyDown事件。 – stonito

+0

另外,如果你的菜单包含分隔符,你应该用'node.DropDownItems.OfType ())'来更改'node.DropDownItems',以防止转换错误异常检查快捷方式仅限于ToolStripMenuItem对象。 – stonito

0

您是在代码中打开ContextMenuStrip,还是在FormContextMenuStrip属性中设置为您创建的ContextMenuStrip?如果它正在代码中打开,您是否可以设置Form属性?这应该让您不必先打开菜单即可执行快捷方式。

2

使用ToolStripMenuItem.ShortCutKeys属性,让你无需迭代,并调用事件处理程序。

示例代码:

ContextMenuStrip _contextMenuStrip = new ContextMenuStrip(); 
var menuItem = new ToolStripMenuItem("Copy"); 
menuItem.ShortcutKeys = Keys.Control | Keys.C; 
_contextMenuStrip.Items.Add(menuItem); 
相关问题