WPF阻止TreeViewItem通过代码

时间:2015-11-06 12:02:01

标签: wpf treeview contextmenu

我有以下代码,我将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;

3 个答案:

答案 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中我们可以看到: enter image description here

答案 2 :(得分:-1)

这不是一个错误。这是合乎逻辑的行为。例如,如果用户单击DataGrid上的列,则它始终显示相同的ContextMenu。因此,如果您将ContextMenu设置为null,那么它只是用基本上下文菜单替换您的上下文菜单。

所以我们可以做一个小技巧。我们只是更改ContextMenu的可见性状态。

为了拥有Visibility的个人ContextMenu,您应该创建另一个Visibility状态HiddenVisibleCollapse )到你创建的ContextMenu

System.Windows.Controls.ContextMenu personMenu = new ContextMenu();
personMenu.Items.Add(menu6);
personMenu.Visibility = System.Windows.Visibility.Hidden;
person1TVI.ContextMenu = personMenu;            
person2TVI.ContextMenu = personMenu;