【问题标题】:Open custom ContextMenuStrip on right-click右键单击打开自定义 ContextMenuStrip
【发布时间】:2015-05-19 14:26:59
【问题描述】:

我正在使用不同类型的 TreeNode 创建一个 TreeView,每个 TreeNode 都有自己的 ContextMenuStrip 菜单。 我有一个类ElementTreeNode,它继承自TreeNode。我想添加一个ElementContextMenu,它继承自ContextMenuStrip 菜单,右键单击节点时应该打开。

我的第一种方法是简单地将ElementContextMenu 的实例添加到我的ElementTreeNodeContextMenuStrip 属性中。但是我向ElementTreeNode 添加了一个EventHandler,我无法以这种方式访问​​它。可能是因为属性向下转换为ContextMenuStrip,因此丢失了仅存在于ElementContextMenu 中的EventHandler:

class ElementTreeNode : TreeNode
{
    public ElementTreeNode()
    {
        ContextMenuStrip = new ElementContextMenu();
    }
}

我的第二个想法是给类添加一个属性ElementContextMenu,然后让右键事件打开这个菜单而不是ContextMenuStrip属性:

class ElementTreeNode : TreeNode
{
    public ElementContextMenu ElementContextMenu;

    public ElementTreeNode()
    {
        ElementContextMenu = new ElementContextMenu();
    }
}

所以我的问题是:
当我右键单击节点时,如何打开ElementContextMenu 属性而不是ContextMenuStrip
有没有办法改变这种行为?

【问题讨论】:

    标签: c# winforms treeview


    【解决方案1】:

    只需手动显示ContextMenu,不要分配TreeView 的上下文菜单。例如

            TreeView tv = new TreeView() { Dock = DockStyle.Fill };
            tv.Nodes.Add(new ElementTreeNode { Text = "Node 1" });
            tv.Nodes.Add(new ElementTreeNode { Text = "Node 2" });
            tv.MouseDown += (o, e) => {
                TreeNode n = tv.GetNodeAt(e.Location);
                tv.SelectedNode = n; // known bug, force selected node
                if (e.Button == MouseButtons.Right) {
                    if (n is ElementTreeNode) {
                        var n2 = (ElementTreeNode) n;
                        n2.ElementContextMenu.Show(tv, e.Location);
                    }
                }
            };
    

    【讨论】:

      【解决方案2】:

      试着让你的ElementTreeNode 类像这样:

      class ElementTreeNode : TreeNode
      {    
      
        public ElementTreeNode()
        {
          ElementContextMenu = new ElementContextMenu();
        }
      
        public ElementContextMenu ElementContextMenu
        {
          get { 
            return ContextMenuStrip as ElementContextMenu; 
          }
          private set { 
            ContextMenuStrip = value; 
          }
        }
      }
      

      现在,当您需要添加 EventHandler 或访问仅存在于 ElementContextMenu 类中的属性时,请使用 ElementContextMenu 属性。

      old ContextMenuStrip 属性的行为方式仍然相同(右键单击节点时打开上下文菜单),但它将打开您的 ElementContextMenu 实例。

      【讨论】:

      • 感谢您的帮助!这个解决方案接近我想要的!
      猜你喜欢
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 2021-10-12
      相关资源
      最近更新 更多