我有一个带有ContextMenuStrip的TreeView(右键单击打开)ToolStripMenuItems,带有“Ctrl + C,Ctrl + V等”的快捷方式。
问题是只有在打开ContextMenuStrip时,ToolStripMenuItem.Click的Action才会按快捷方式触发。
我认为当隐藏ContextMenuStip时,快捷方式也必须有效。
我做错了什么或者ShortCuts不是全局的,我需要在这里分配TreeView的KeyPress事件并公开快捷方式的逻辑?日Thnx。
答案 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.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
被隐藏/未打开。
答案 1 :(得分:0)
是的,您需要为Treeview编写代码,也可以根据您的要求为按键或按键。