ToolStripMenuItem和KeyPress或KeyDown事件

本文关键字:KeyDown 事件 KeyPress ToolStripMenuItem | 更新日期: 2023-09-27 18:14:35

我使用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。对如何实现这个功能有什么建议吗?

ToolStripMenuItem和KeyPress或KeyDown事件

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

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

封闭的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