【问题标题】:Handling shortcuts from context menu处理上下文菜单中的快捷方式
【发布时间】:2012-08-25 21:32:18
【问题描述】:

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

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

【问题讨论】:

  • 嗯,我不知道为什么快捷方式在上下文菜单未激活时不起作用,但有一个建议,当你处理按键事件并确定组合键时,只需调用相关的函数到组合键。为什么要以编程方式迭代上下文菜单?
  • 因为这样可以避免代码重复。我想在菜单中有快捷方式,所以我必须在那里指定它们,并且必须在那里设置处理程序。这应该是我唯一指定两者的地方。
  • 我可以给你的一个建议是,尝试使用 ctrl 键生成快捷方式,看看它在菜单关闭时是否有效?
  • 不确定您的意思。我设置了快捷键Ctrl+1Ctrl+2,...,它们在菜单被激活时工作,在菜单未显示时不工作。
  • 我也想说同样的话。拥有 Ctrl+1、Ctrl+2 等快捷键。实际上 Alt 键激活菜单。也许你应该试试 Alt+1, Alt+2

标签: c# winforms events keyboard-shortcuts contextmenu


【解决方案1】:

使用 ToolStripMenuItem.ShortCutKeys 属性,这样您就无需迭代和调用事件处理程序。

示例代码:

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

【讨论】:

    【解决方案2】:

    您是在代码中打开ContextMenuStrip,还是将FormContextMenuStrip 属性设置为您创建的ContextMenuStrip?如果它是在代码中打开的,你可以设置Form 属性吗?这应该让您无需先打开菜单即可使用快捷方式。

    【讨论】:

    • 这实际上是正确的答案。无需手动过滤按键事件。
    【解决方案3】:

    最后,我在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);
      }
    

    【讨论】:

    • 我已经编辑了你的答案:一些更正,正确的事件是 KeyDown。在 foreach 中,您需要检查对象是否是 ToolStripMenuItem,因为如果它是分隔符,则会引发异常。
    • 也许您必须在表单上设置 KeyPreview=true; 以确保检查所有 KeyDown 事件。
    • 另外,如果您的菜单包含分隔符,您应该将 node.DropDownItems 更改为 node.DropDownItems.OfType&lt;ToolStripMenuItem&gt;()) 以防止仅对 ToolStripMenuItem 对象进行转换错误异常检查快捷方式。
    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多