我有一个Windows窗体显示为模型对话框。它有一个类ContextMenuStrip
的上下文菜单。我在快捷菜单中设置了几个项目的快捷方式。但是这个快捷键只有在显示上下文菜单时才起作用。即使上下文菜单未激活,如何使它们工作?从上下文菜单中处理快捷方式
我知道的唯一方法是处理表格的KeyPress
事件,递归遍历上下文菜单中的所有项目,并将其ShortcutKeys
属性与按下的实际按键进行比较。如果匹配,请手动为此项目致电OnClick
事件。任何更好的想法?
我有一个Windows窗体显示为模型对话框。它有一个类ContextMenuStrip
的上下文菜单。我在快捷菜单中设置了几个项目的快捷方式。但是这个快捷键只有在显示上下文菜单时才起作用。即使上下文菜单未激活,如何使它们工作?从上下文菜单中处理快捷方式
我知道的唯一方法是处理表格的KeyPress
事件,递归遍历上下文菜单中的所有项目,并将其ShortcutKeys
属性与按下的实际按键进行比较。如果匹配,请手动为此项目致电OnClick
事件。任何更好的想法?
最后,我实现了手动迭代的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);
}
您是在代码中打开ContextMenuStrip
,还是在Form
的ContextMenuStrip
属性中设置为您创建的ContextMenuStrip
?如果它正在代码中打开,您是否可以设置Form
属性?这应该让您不必先打开菜单即可执行快捷方式。
使用ToolStripMenuItem.ShortCutKeys属性,让你无需迭代,并调用事件处理程序。
示例代码:
ContextMenuStrip _contextMenuStrip = new ContextMenuStrip();
var menuItem = new ToolStripMenuItem("Copy");
menuItem.ShortcutKeys = Keys.Control | Keys.C;
_contextMenuStrip.Items.Add(menuItem);
好吧,我不知道为什么,当上下文菜单没有被激活的快捷方式不起作用,而是一个建议,当你处理按键事件,您确定组合键,只需调用与组合键相关的功能即可。为什么要以编程方式迭代contextmenus? –
因为这允许我避免代码重复。我想在菜单中有快捷方式,所以我必须在那里指定它们,并且必须在那里设置处理程序。这应该是我指定的唯一地方。 – Mikhail
我可以给你的一个建议是,尝试使用ctrl键生成shourtcut并查看菜单关闭时它是否正常工作? –