3

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

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

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

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

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

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

4

1 回答 1

2

您只需要覆盖 ContextMenuStrip_Opening 事件。发送者对象是一个 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(...);
  }
}
于 2013-03-15T17:23:11.700 回答