ToolStripMenuItem的ContextMenuStrip快捷键如何工作

时间:2012-09-28 07:35:40

标签: c# winforms contextmenustrip shortcut-key

我有一个带有ContextMenuStrip的TreeView(右键单击打开)ToolStripMenuItems,带有“Ctrl + C,Ctrl + V等”的快捷方式。

问题是只有在打开ContextMenuStrip时,ToolStripMenuItem.Click的Action才会按快捷方式触发。

我认为当隐藏ContextMenuStip时,快捷方式也必须有效。

我做错了什么或者ShortCuts不是全局的,我需要在这里分配TreeView的KeyPress事件并公开快捷方式的逻辑?日Thnx。

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,并且不想重新编程ContextMenuStrip已经提供给我的访问功能。

最大的问题是,当我展开或更改ContextMenuStrip项时,我必须更改或更改自己的Key-Events。我的目的是绕过这个并将全局快捷键重定向到ContextMenuStrip以执行代码点击。

首先,我构建了一个方法,以递归方式在一个列表中获取ToolStripMenuItems的所有ContextMenuStrip

    private List<ToolStripMenuItem> getContextMenuItems(ToolStripItemCollection items)
    {
        List<ToolStripMenuItem> result = new List<ToolStripMenuItem>();
        foreach (ToolStripMenuItem item in items)
        {
            result.Add(item);
            if (item.HasDropDownItems)
            {
                result.AddRange(this.getContextMenuItems(item.DropDownItems));
            }
        }
        return result;
    }

然后我设置KeyUp事件以在包装器控件上捕获我的键。 this.cmsCellRightClickContextMenuStrip

    private void xxxxx_KeyUp(object sender, KeyEventArgs e)
    {
        Keys pressed = e.KeyCode;
        if (e.Control) pressed = pressed | Keys.Control;
        if (e.Shift) pressed = pressed | Keys.Shift;
        if (e.Alt) pressed = pressed | Keys.Alt;

        ToolStripMenuItem actionItem = this.getContextMenuItems(this.cmsCellRightClick.Items)
            .Where(x => x.ShortcutKeys == pressed).FirstOrDefault();
        if (actionItem != null)
        {
            actionItem.PerformClick();
        }
        e.SuppressKeyPress = true;
    }

结果是它会抓住我的击键并将它们发送到我的ContextMenuStrip并执行点击,即使ContextMenuStrip被隐藏/未打开。

答案 1 :(得分:0)

是的,您需要为Treeview编写代码,也可以根据您的要求为按键或按键。