我有一个显示为模型对话框的 Windows 窗体。它有一个上下文菜单 class ContextMenuStrip
。我在上下文菜单中设置了几个项目的快捷方式。但是此快捷方式仅在显示上下文菜单时才有效。即使未激活上下文菜单,如何使它们工作?
我知道的唯一方法是处理KeyPress
表单事件,递归遍历上下文菜单中的所有项目,并将其ShortcutKeys
属性与实际按下的键进行比较。如果匹配,手动调用OnClick
该项目的事件。有更好的想法吗?
我有一个显示为模型对话框的 Windows 窗体。它有一个上下文菜单 class ContextMenuStrip
。我在上下文菜单中设置了几个项目的快捷方式。但是此快捷方式仅在显示上下文菜单时才有效。即使未激活上下文菜单,如何使它们工作?
我知道的唯一方法是处理KeyPress
表单事件,递归遍历上下文菜单中的所有项目,并将其ShortcutKeys
属性与实际按下的键进行比较。如果匹配,手动调用OnClick
该项目的事件。有更好的想法吗?
使用 ToolStripMenuItem.ShortCutKeys 属性,这样您就无需迭代和调用事件处理程序。
示例代码:
ContextMenuStrip _contextMenuStrip = new ContextMenuStrip();
var menuItem = new ToolStripMenuItem("Copy");
menuItem.ShortcutKeys = Keys.Control | Keys.C;
_contextMenuStrip.Items.Add(menuItem);
您是在打开ContextMenuStrip
in 代码还是将集合的ContextMenuStrip
属性Form
设置为ContextMenuStrip
您创建的?如果它是在代码中打开的,你可以设置Form
属性吗?那应该让您无需先打开菜单即可执行快捷方式。
最后,我在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);
}