动态上下文菜单

3
我正在尝试想出一种解决方案,创建可以在运行时生成的动态上下文菜单。我实现了一个名为IGuiCommand的接口,该接口实现了类似于普通命令模式的功能。
interface IGuiCommand
{
    Execute();
    Undo();
    bool CanUndo {get;set;}
    Redo();
    string CommandName {get;set;}
    string CommandDescription {get;set;}
}

这个想法是允许被右键点击的控件在给定的上下文菜单中提交自己的命令列表以显示。
虽然我可以让每个控件构建一个上下文菜单,但我更喜欢使用单个上下文菜单并动态生成菜单,以便在运行时更容易进行管理。当控件状态或应用程序状态发生变化时,我希望上下文菜单能够反映出变化。例如,如果我右键单击复选框,则复选框将提交启用或禁用命令到上下文菜单中,取决于复选框的当前选中值。
如果我有某种方式知道哪个控件被“右键单击”,以便为该特定控件打开上下文菜单,我认为我可以很容易地实现这一点。
令人惊讶的是,ContextMenu事件没有提供一个EventArg来指示被右键点击的控件(或任何导致上下文菜单弹出的命令)。

哈哈,是的,我刚意识到我没有添加那个信息。这是WinForms,我会添加标签的。 - galford13x
这对WinForms来说可能是一个困难的问题。但如果有人知道如何在WPF中实现,我非常愿意听取建议。我现在正在将我的GUI重构为小型实用程序,所以我可以在WPF中完成它。 - galford13x
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(...);
  }
}

实际上,当我四处寻找时,我发现我一直在尝试使用旧的ContextMenu而不是ContextMenuStrip。所有我需要的功能都在新的ContextMenuStrip控件中。感谢您的回复。 - galford13x

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接