【问题标题】:WPF prevent TreeViewItem to inherit contextMenu from parent by codeWPF 阻止 TreeViewItem 通过代码从父级继承 contextMenu
【发布时间】:2015-11-06 12:02:00
【问题描述】:

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

【问题讨论】:

  • 请看我的回答

标签: wpf treeview contextmenu


【解决方案1】:

设置如下:

System.Windows.Controls.ContextMenu nullMenu = new ContextMenu();
        nullMenu.Visibility = Visibility.Hidden;

        person1.ContextMenu = personMenu;
        person2.ContextMenu = nullMenu;

【讨论】:

  • <ContextMenu x:Key="nullMenu" Visibility="Hidden"> <!--Used for hiding unwanted popup--> </ContextMenu>。这是等效的 XAML 代码。现在使用它,例如<Label Content="{Binding TagName}" ContextMenu="{StaticResource nullMenu}" />
【解决方案2】:

这不是错误。如果您在 person2 的 ContextMenuOpening 事件上设置断点,您会看到它根本没有触发。 之后,您可以尝试在 manager2 的 ContextMenuOpening 事件上设置断点。它在 person2 节点上被触发,但仅仅是因为 TreeViewItem 是 ItemsControl。 在 WPF Visualizer 中,我们可以看到:

【讨论】:

    【解决方案3】:

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

    所以我们可以做一个小把戏。我们只是改变您的 ContextMenu 的可见性状态。

    因此,要拥有ContextMenu 的个人Visibility,您应该为您创建的ContextMenu 创建另一个VisibilityHiddenVisibleCollapse)状态。

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

    【讨论】:

    • @user5514770 如果我的回答对您的问题有帮助,您可以将其标记为答案以简化其他人的搜索
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    相关资源
    最近更新 更多