2012-08-25 111 views
3

我有一個Windows窗體顯示爲模型對話框。它有一個類ContextMenuStrip的上下文菜單。我在快捷菜單中設置了幾個項目的快捷方式。但是這個快捷鍵只有在顯示上下文菜單時才起作用。即使上下文菜單未激活,如何使它們工作?從上下文菜單中處理快捷方式

我知道的唯一方法是處理表格的KeyPress事件,遞歸遍歷上下文菜單中的所有項目,並將其ShortcutKeys屬性與按下的實際按鍵進行比較。如果匹配,請手動爲此項目致電OnClick事件。任何更好的想法?

+0

好吧,我不知道爲什麼,當上下文菜單沒有被激活的快捷方式不起作用,而是一個建議,當你處理按鍵事件,您確定組合鍵,只需調用與組合鍵相關的功能即可。爲什麼要以編程方式迭代contextmenus? –

+0

因爲這允許我避免代碼重複。我想在菜單中有快捷方式,所以我必須在那裏指定它們,並且必須在那裏設置處理程序。這應該是我指定的唯一地方。 – Mikhail

+0

我可以給你的一個建議是,嘗試使用ctrl鍵生成shourtcut並查看菜單關閉時它是否正常工作? –

回答

1

最後,我實現了手動迭代的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); 
    } 
+0

我編輯了你的答案:一些更正,正確的事件是KeyDown。在foreach中,您需要檢查對象是否是ToolStripMenuItem,因爲如果它是分隔符,則會引發異常。 – Pedro77

+0

也許你必須在窗體上設置'KeyPreview = true;'來確保檢查所有的KeyDown事件。 – stonito

+0

另外,如果你的菜單包含分隔符,你應該用'node.DropDownItems.OfType ())'來更改'node.DropDownItems',以防止轉換錯誤異常檢查快捷方式僅限於ToolStripMenuItem對象。 – stonito

0

您是在代碼中打開ContextMenuStrip,還是在FormContextMenuStrip屬性中設置爲您創建的ContextMenuStrip?如果它正在代碼中打開,您是否可以設置Form屬性?這應該讓您不必先打開菜單即可執行快捷方式。

2

使用ToolStripMenuItem.ShortCutKeys屬性,讓你無需迭代,並調用事件處理程序。

示例代碼:

ContextMenuStrip _contextMenuStrip = new ContextMenuStrip(); 
var menuItem = new ToolStripMenuItem("Copy"); 
menuItem.ShortcutKeys = Keys.Control | Keys.C; 
_contextMenuStrip.Items.Add(menuItem); 
相關問題