C# TreeView';的上下文菜单显示在topnode上,而不是TreeViewItem';s

C# TreeView';的上下文菜单显示在topnode上,而不是TreeViewItem';s,c#,wpf,treeview,C#,Wpf,Treeview,我遇到了一个无法解决的问题。这是我的TreeView的XAML: <TreeView ItemsSource="{Binding Parents}" ContextMenu="{StaticResource TreeViewContextMenu}"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Children}"&g

我遇到了一个无法解决的问题。这是我的TreeView的XAML:

    <TreeView ItemsSource="{Binding Parents}" ContextMenu="{StaticResource TreeViewContextMenu}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                <StackPanel Orientation="Horizontal">
                    <Image Source="{Binding Image}" />
                    <TextBlock Text="{Binding Name}" />
                </StackPanel>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
当我右键单击除第一个项目外的任何项目时,将显示
TreeViewItemContextMenu
,正如预期的那样。 但问题是,当我右键单击topnode时,会出现
TreeViewContextMenu
。 我试图完全不使用
TreeViewContextMenu
,但是topnode也没有
ContextMenu


我很高兴知道我错过了什么,错过了什么。提前感谢。

我正在尝试使用您的
xaml代码。这是我的作品

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ContextMenu x:Key="TreeViewItemContextMenu">
            <MenuItem Header="Item Menu"/>
        </ContextMenu>
        <ContextMenu x:Key="TreeViewContextMenu">
            <MenuItem Header="Tree Menu"/>
        </ContextMenu>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
            <Setter Property="ContextMenu" Value="{StaticResource TreeViewItemContextMenu}" />
        </Style>
    </Window.Resources>
    <Grid>
        <TreeView ItemsSource="{Binding Parents}" ContextMenu="{StaticResource TreeViewContextMenu}">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                    <StackPanel Orientation="Horizontal">
                        <Image Source="{Binding Image}" />
                        <TextBlock Text="{Binding Name}" />
                    </StackPanel>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    </Grid>
</Window>

编码

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Parents = new ObservableCollection<MyTreeItem>();
            var children=new ObservableCollection<MyTreeItem>();
            children.Add(new MyTreeItem(){ Name="child1"});
            children.Add(new MyTreeItem(){ Name="child2"});
            Parents.Add(new MyTreeItem() { Name = "Parent Node", Children = children });

            this.DataContext = this;
        }

        public ObservableCollection<MyTreeItem> Parents { get; set; }

    }

    public class MyTreeItem {
        public string Name { get; set; }
        public ObservableCollection<MyTreeItem> Children { get; set; }
    }
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
父对象=新的可观察集合();
var children=新的ObservableCollection();
Add(新的MyTreeItem(){Name=“child1”});
Add(新的MyTreeItem(){Name=“child2”});
添加(新的MyTreeItem(){Name=“Parent Node”,Children=Children});
this.DataContext=this;
}
公共可观测集合父项{get;set;}
}
公共类MyTreeItem{
公共字符串名称{get;set;}
公共可观测集合子项{get;set;}
}
当我单击顶部节点和子节点时,上下文菜单是相同的


您可以右键单击topnode的标题吗?我认为你的topnode标题很短。我看到你用的是StackPanel。Stackpanel拉伸树视图项,您可以单击Stackpanel外部。我尝试右键单击
文本块
图像
,结果相同:如果右键单击顶部节点,则出现的
上下文菜单
错误,但如果右键单击任何其他节点(无论我是右键单击
图像
还是
文本块
),结果是正确的。这对我来说真的很奇怪。对不起,我在写问题时犯了一个错误。不知道是否有必要,但整个问题实际上不是放在别处的
窗口
,而是
内容控制
。我编辑了这个问题。嗯……我所做的是用与以前相同的代码创建了新项目是的。它很管用!有点神奇或者什么的,我不知道。无论如何,谢谢你的回答,它让我得到了我需要的结果。
public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Parents = new ObservableCollection<MyTreeItem>();
            var children=new ObservableCollection<MyTreeItem>();
            children.Add(new MyTreeItem(){ Name="child1"});
            children.Add(new MyTreeItem(){ Name="child2"});
            Parents.Add(new MyTreeItem() { Name = "Parent Node", Children = children });

            this.DataContext = this;
        }

        public ObservableCollection<MyTreeItem> Parents { get; set; }

    }

    public class MyTreeItem {
        public string Name { get; set; }
        public ObservableCollection<MyTreeItem> Children { get; set; }
    }