我有一個Windows窗體顯示爲模型對話框。它有一個類ContextMenuStrip
的上下文菜單。我在快捷菜單中設置了幾個項目的快捷方式。但是這個快捷鍵只有在顯示上下文菜單時才起作用。即使上下文菜單未激活,如何使它們工作?從上下文菜單中處理快捷方式
我知道的唯一方法是處理表格的KeyPress
事件,遞歸遍歷上下文菜單中的所有項目,並將其ShortcutKeys
屬性與按下的實際按鍵進行比較。如果匹配,請手動爲此項目致電OnClick
事件。任何更好的想法?
我有一個Windows窗體顯示爲模型對話框。它有一個類ContextMenuStrip
的上下文菜單。我在快捷菜單中設置了幾個項目的快捷方式。但是這個快捷鍵只有在顯示上下文菜單時才起作用。即使上下文菜單未激活,如何使它們工作?從上下文菜單中處理快捷方式
我知道的唯一方法是處理表格的KeyPress
事件,遞歸遍歷上下文菜單中的所有項目,並將其ShortcutKeys
屬性與按下的實際按鍵進行比較。如果匹配,請手動爲此項目致電OnClick
事件。任何更好的想法?
最後,我實現了手動迭代的KeyPressed
事件處理程序:
Action<ToolStripMenuItem> check_shortcut = null;
check_shortcut = (node) =>
{
if (node.ShortcutKeys == e.KeyData)
{
node.PerformClick();
}
foreach (ToolStripMenuItem child in node.DropDownItems)
{
check_shortcut(child);
}
};
foreach (ToolStripMenuItem item in MyContextMenuStrip.Items)
{
check_shortcut(item);
}
您是在代碼中打開ContextMenuStrip
,還是在Form
的ContextMenuStrip
屬性中設置爲您創建的ContextMenuStrip
?如果它正在代碼中打開,您是否可以設置Form
屬性?這應該讓您不必先打開菜單即可執行快捷方式。
使用ToolStripMenuItem.ShortCutKeys屬性,讓你無需迭代,並調用事件處理程序。
示例代碼:
ContextMenuStrip _contextMenuStrip = new ContextMenuStrip();
var menuItem = new ToolStripMenuItem("Copy");
menuItem.ShortcutKeys = Keys.Control | Keys.C;
_contextMenuStrip.Items.Add(menuItem);
好吧,我不知道爲什麼,當上下文菜單沒有被激活的快捷方式不起作用,而是一個建議,當你處理按鍵事件,您確定組合鍵,只需調用與組合鍵相關的功能即可。爲什麼要以編程方式迭代contextmenus? –
因爲這允許我避免代碼重複。我想在菜單中有快捷方式,所以我必須在那裏指定它們,並且必須在那裏設置處理程序。這應該是我指定的唯一地方。 – Mikhail
我可以給你的一個建議是,嘗試使用ctrl鍵生成shourtcut並查看菜單關閉時它是否正常工作? –