C# TreeView';的上下文菜单显示在topnode上,而不是TreeViewItem';s
我遇到了一个无法解决的问题。这是我的TreeView的XAML: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 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; }
}