右键打开自定义ContextMenuStrip
本文关键字:ContextMenuStrip 自定义 右键 | 更新日期: 2023-09-27 17:49:33
我正在创建一个具有不同类型treenode的TreeView,每个treenode都有自己的ContextMenuStrip菜单。我有一个继承自TreeNode
的类ElementTreeNode
。我想添加一个继承自ContextMenuStrip
菜单的ElementContextMenu
,当右键单击节点时应该打开。
我的第一种方法是简单地将ElementContextMenu
的实例添加到ElementTreeNode
的ContextMenuStrip
属性中。但是我添加了一个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
?
有没有办法改变这种行为?
手动显示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
实例。