1

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

问题是 ToolStripMenuItem.Click 的 Action 仅在打开 ContextMenuStrip 时才会通过快捷方式触发。

我认为当 ContextMenuStip 被隐藏时,快捷方式也必须起作用。

我做错了什么或者快捷方式不是全局的,我需要分配 TreeView 的 KeyPress 事件并在此处复制快捷方式的逻辑?谢谢。

4

2 回答 2

3

我有同样的问题,不想重新编程ContextMenuStrip已经提供给我的访问功能。

最大的问题是,当我扩展或更改ContextMenuStrip项目时,我必须更改或更改我自己的键事件。我的目标是绕过这个并将全局快捷键重定向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.cmsCellRightClick是我的ContextMenuStrip

    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是隐藏/未打开。

于 2015-08-31T16:43:35.783 回答
0

是的,您需要为 Treeview 编写代码,也可能是 Key Press 或 Key Down 根据您的要求。

于 2012-09-28T08:30:12.677 回答