【问题标题】:ToolStripMenuItem and KeyPress or KeyDown eventToolStripMenuItem 和 KeyPress 或 KeyDown 事件
【发布时间】:2014-01-25 01:16:54
【问题描述】:

我正在使用ToolStripDropDownButton 并动态添加如下菜单项:

toolStripDropDownButton1.DropDownItems.Clear();

ToolStripMenuItem item1 = new ToolStripMenuItem("Item1");
toolStripDropDownButton1.DropDownItems.Add(item1);

ToolStripMenuItem item2 = new ToolStripMenuItem("Item2");
toolStripDropDownButton1.DropDownItems.Add(item2);

我想在按下 Delete 键时删除选定的菜单项。但是ToolStripMenuItem 没有KeyPressKeyDown 事件。

我正在使用 Visual Studio 2010 和 .NET 4.0。有关如何实现此功能的任何建议?

【问题讨论】:

  • 选中的菜单项”是什么意思?是悬停的菜单项吗?
  • 是的,悬停的菜单项。谢谢。

标签: c# keypress


【解决方案1】:

您可以使用菜单的DropDown 元素,然后将KeyDown 事件绑定到它。 现在您知道在菜单上按下了哪个键,但您不知道鼠标光标指向哪个菜单项。绑定ToolStripMenuItems 的MouseEnter 事件,您现在可以存储指向的事件。现在你知道当DropDownKeyDown事件被触发时,指向了哪个项目,按下了哪个键。

【讨论】:

    【解决方案2】:

    当您单击单独的删除按钮时,听起来好像您想从下拉列表中删除所选项目。那是你想要做的吗?如果是这样,那么您需要查看删除按钮的单击事件并根据当前选定的项目删除列表项。不需要 KeyDown 的 KeyPress。

    【讨论】:

    • 我没有任何删除按钮,只有下拉菜单项。我想在按下 Delete 键时删除所选项目。问题是 ToolStripMenuItem 没有 KeyPress 或 KeyDown 事件。有什么建议或解决方法吗?
    • 哦,我明白了。那么,不,你不能那样做。 ToolStrip 吃掉了所有的键盘事件。做你想做的事情的唯一方法是创建一个从原始工具派生的新 ToolStrip 控件并添加你想要的位。我会重新考虑你想要实现的目标。
    • 感谢您的回复。如果不能轻松完成,我可能需要使用不同的方法。
    【解决方案3】:

    封闭的 ToolStrip 获取关键事件,因此您可以通过以下方式处理它:

    toolStripDropDownButton1.KeyDown += (s, e) =>
    {
        if (e.KeyCode == Keys.Delete)
        {
            foreach (var item in ((ToolStrip)s).Items.OfType<ToolStripMenuItem>())
            {
                if (item.Selected)
                {
                    ((ToolStrip)s).Items.Remove(item);
                    break;
                }
            }
        }
    };
    

    (此代码完全未经测试)

    我在事件处理程序中使用了 ((ToolStrip)s),以防您想在其他地方定义一个可由多个不同 ToolStrip 实例调用的静态方法。当然,在这种情况下,您可以将 ((ToolStrip)s) 替换为 toolStripDropDownButton1

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多