【问题标题】:dynamic context menus动态上下文菜单
【发布时间】:2013-03-16 01:23:11
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 哈哈是的,我刚刚意识到我没有添加该信息。是 WinForms 我将添加标签
  • 这对WinForms来说一定是个难题。但是,如果有人对如何为 WPF 完成它有一个答案,我会全力以赴。我刚刚将我的 GUI 重做为一个小实用程序,以便可以在 WPF 中完成。

标签: c# .net winforms contextmenu


【解决方案1】:

您只需要覆盖 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 控件中。感谢您的回复。
猜你喜欢
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 2017-11-10
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多