2013-03-15 119 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