我有以下代码,我将ContextMenu中的ContextMenu表示为null,但它始终显示与treeviewitem父项相同的ContextMenu!那是一个错误吗?我该如何解决?
Tree.Items.Clear();
System.Windows.Controls.TreeViewItem ceo = new System.Windows.Controls.TreeViewItem() { Header = "CEO" };
System.Windows.Controls.TreeViewItem manager1 = new System.Windows.Controls.TreeViewItem() { Header = "Manager1" };
System.Windows.Controls.TreeViewItem manager2 = new System.Windows.Controls.TreeViewItem() { Header = "Manager2" };
System.Windows.Controls.TreeViewItem person1 = new System.Windows.Controls.TreeViewItem() { Header = "person1" };
System.Windows.Controls.TreeViewItem person2 = new System.Windows.Controls.TreeViewItem() { Header = "person2" };
manager1.Items.Add(person1);
manager2.Items.Add(person2);
ceo.Items.Add(manager1);
ceo.Items.Add(manager2);
Tree.Items.Add(ceo);
// context Menu
MenuItem menu1 = new MenuItem();
menu1.Header = "Menu1";
MenuItem menu2 = new MenuItem();
menu2.Header = "Menu2";
MenuItem menu3 = new MenuItem();
menu3.Header = "Menu3";
MenuItem menu4 = new MenuItem();
menu4.Header = "Menu4";
MenuItem menu5 = new MenuItem();
menu5.Header = "Menu5";
MenuItem menu6 = new MenuItem();
menu6.Header = "Menu6";
System.Windows.Controls.ContextMenu ceoMenu = new ContextMenu();
ceoMenu.Items.Add(menu1);
ceoMenu.Items.Add(menu2);
ceoMenu.Items.Add(menu3);
System.Windows.Controls.ContextMenu managerMenu = new ContextMenu();
managerMenu.Items.Add(menu4);
managerMenu.Items.Add(menu5);
ceo.ContextMenu = ceoMenu;
manager1.ContextMenu = managerMenu;
manager2.ContextMenu = managerMenu;
System.Windows.Controls.ContextMenu personMenu = new ContextMenu();
personMenu.Items.Add(menu6);
person1.ContextMenu = personMenu;
person2.ContextMenu = null;
答案 0 :(得分:2)
设置如下:
System.Windows.Controls.ContextMenu nullMenu = new ContextMenu();
nullMenu.Visibility = Visibility.Hidden;
person1.ContextMenu = personMenu;
person2.ContextMenu = nullMenu;
答案 1 :(得分:0)
这不是一个错误。如果在person2的ContextMenuOpening事件上设置断点,您将看到它根本没有被触发。 之后,您可以尝试在manager2的ContextMenuOpening事件上设置断点。它被触发并在person2节点上,但仅仅因为TreeViewItem是ItemsControl。 在WPF Visualizer中我们可以看到:
答案 2 :(得分:-1)
这不是一个错误。这是合乎逻辑的行为。例如,如果用户单击DataGrid上的列,则它始终显示相同的ContextMenu。因此,如果您将ContextMenu
设置为null
,那么它只是用基本上下文菜单替换您的上下文菜单。
所以我们可以做一个小技巧。我们只是更改ContextMenu的可见性状态。
为了拥有Visibility
的个人ContextMenu
,您应该创建另一个Visibility
状态Hidden
,Visible
或Collapse
)到你创建的ContextMenu
。
System.Windows.Controls.ContextMenu personMenu = new ContextMenu();
personMenu.Items.Add(menu6);
personMenu.Visibility = System.Windows.Visibility.Hidden;
person1TVI.ContextMenu = personMenu;
person2TVI.ContextMenu = personMenu;