右键打开自定义ContextMenuStrip

本文关键字:ContextMenuStrip 自定义 右键 | 更新日期: 2023-09-27 17:49:33

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

我的第一种方法是简单地将ElementContextMenu的实例添加到ElementTreeNodeContextMenuStrip属性中。但是我添加了一个EventHandler到ElementTreeNode,我不能以这种方式访问。可能是因为属性向下转换到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 ?
有没有办法改变这种行为?

右键打开自定义ContextMenuStrip

手动显示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);
                }
            }
        };

试着让你的ElementTreeNode类像这样:

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

现在,无论何时你需要添加一个eventandler或访问属性,只存在于ElementContextMenu类使用ElementContextMenu属性。

旧的 ContextMenuStrip属性仍然会以相同的方式运行(当您右键单击节点时打开上下文菜单),但它将打开您的ElementContextMenu实例。
相关文章:
  • 没有找到相关文章