【问题标题】:How does ContextMenuStrip Shortcut Keys of ToolStripMenuItem worksToolStripMenuItem 的 ContextMenuStrip 快捷键是如何工作的
【发布时间】:2015-09-01 17:45:27
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# winforms contextmenustrip keyboard-shortcuts


    【解决方案1】:

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

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

    首先,我构建了一个方法,可以递归地将ContextMenuStrip 中的所有ToolStripMenuItems 放在一个列表中:

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

    【讨论】:

    • 如果上下文菜单中有分隔符,getContextMenuItems 方法可能会失败(引发 InvalidCastException)。这可以通过在 foreach 循环中使用通用 ToolStripItem 并检查转换为 ToolStripMenuItem 是否成功来规避。
    【解决方案2】:

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

    【讨论】:

    • 这很奇怪,但是 KeyDown TreeView 事件中的 args.KeyData 与我设置为快捷方式的组合不匹配。它有额外的修饰符键码。
    • 但是我以一种愚蠢的方式解决了问题:我错误地为不同的菜单项设置了相同的快捷方式。当我修复它时,我发现 ContextMenuStrip Shortcuts 如果隐藏起来效果很好。)
    猜你喜欢
    • 1970-01-01
    • 2013-11-28
    • 2014-03-22
    • 2011-09-13
    • 2014-03-25
    • 2012-01-08
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多