动态上下文菜单

本文关键字:菜单 上下文 动态 | 更新日期: 2023-09-27 18:04:00

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

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

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

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

我想我可以很容易地实现这一点,如果我有一些方法知道哪个控件是"右键单击",以便为该特定控件调出上下文菜单。

似乎令人惊讶的是,ContextMenu事件没有提供一个EventArg,表明右键单击控件(或任何命令,将导致上下文菜单弹出)

动态上下文菜单

您只需要重写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(...);
  }
}