动态上下文菜单

时间:2013-03-15 14:45:25

标签: c# .net winforms contextmenu

我正在尝试提供一种解决方案来创建可在运行时生成的动态上下文菜单。我已经实现了一个IGuiCommand接口,它实现了与普通Command模式类似的东西。

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

这个想法是允许右键单击的控件提交它自己的命令列表,以便在给定的上下文菜单中显示。

虽然我可以让每个控件构建一个上下文菜单,但我更喜欢使用单个上下文菜单并动态生成菜单,以便在运行时更轻松地进行管理。当控件状态或应用程序状态发生变化时,我希望上下文菜单能够反映更改。例如,如果我右键单击一个复选框,则复选框将根据复选框的当前Checked值向上下文菜单提交启用或禁用命令以显示。

我想我可以轻松实现这个,如果我有办法知道哪个控件是“右键单击”,以便调出该特定控件的上下文菜单。

似乎令人惊讶的是ContextMenu事件没有提供EventArg来指示右键单击的控件(或任何会导致上下文菜单弹出的命令)

1 个答案:

答案 0 :(得分: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(...);
  }
}