2013-03-15 214 views
3

我正在試圖想出一個解決方案來創建可以在運行時生成的動態上下文菜單。我已經實現了一個接口,它實現了類似於普通命令模式的東西。動態上下文菜單

interface IGuiCommand 
{ 
    Execute(); 
    Undo(); 
    bool CanUndo {get;set;} 
    Redo(); 
    string CommandName {get;set;} 
    string CommandDescription {get;set;} 
} 

的想法是允許其正被點擊提交它的命令自己的列表在給定的上下文菜單中顯示的控制。

雖然我可以讓每個控件構建一個上下文菜單,但我更願意使用單個上下文菜單並動態生成菜單,以便在運行時更輕鬆地進行管理。當控件狀態或應用程序狀態發生變化時,我希望上下文菜單能夠反映更改。例如,如果我右鍵單擊一個複選框,那麼複選框將提交一個啓用或禁用命令以顯示取決於複選框的當前選中值的上下文菜單。

我想我可以很容易地實現這個,如果我有一些方法來知道哪個控件是「右鍵單擊」,以便調出該特定控件的上下文菜單。

這似乎令人驚訝的ContextMenu事件不提供的EventArg指示曾右單擊控件(或任何命令,將導致上下文菜單彈出)

+0

哈哈是啊我剛纔意識到我沒有添加該信息。它是WinForms我將添加標籤 – galford13x 2013-03-15 14:53:48

+0

這對WinForms來說肯定是個難題。但如果任何人有關於如何爲WPF所做的一個答案,我全都耳熟能詳。我現在只是將我的GUI重做成一個小實用程序,所以我可以在WPF中完成它。 – galford13x 2013-03-15 15:56:22

回答

2

你只需要重寫ContextMenuStrip_Opening事件。 sender對象是一個ContextMenuStrip,它包含一個SourceControl元素。當你應用適當的演員時,你將有機會獲得你需要的一切。

private void contextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e) { 
    var contextMenu = (sender as ContextMenuStrip); 
    if (contextMenu != null) { 
    var sourceControl = contextMenu.SourceControl; 
    contextMenuStrip1.Items.Clear(); 
    //contextMenuStrip1.Items.Add(...); 
    } 
} 
+0

事實上,當我四處張望時,我發現我一直在嘗試使用舊的ContextMenu而不是ContextMenuStrip。我需要的所有功能都在新的ContextMenuStrip控件中。感謝您的迴應。 – galford13x 2013-03-15 17:35:50