你为什么不定义项目的上下文菜单呢?
您可以通过样式定义 TreeViewItem 上下文菜单,方法是将其绑定到最终将 x:Shared 设置为 true 的静态资源。它将一劳永逸地在一个地方定义。除非您有非常具体的理由让它在树视图级别发生,否则这种方式可以有效地满足您的需求:在空白处没有菜单。
<Window x:Class="WpfApplication5.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">
<Grid>
<Grid.Resources>
<ContextMenu x:Key="menu" x:Shared="true">
<MenuItem Header="_Open" Click="MenuItemOpen_Click" />
</ContextMenu>
<Style TargetType="TreeViewItem">
<Setter Property="ContextMenu" Value="{StaticResource menu}"/>
</Style>
</Grid.Resources>
<TreeView x:Name="treeView">
<TreeViewItem Header="item1">
<TreeViewItem Header="item2">
<TreeViewItem Header="item3">
</TreeViewItem>
</TreeViewItem>
</TreeViewItem>
</TreeView>
</Grid>
</Window>
告诉我们更多关于你试图以其他方式实现的目标。
编辑
请注意,样式没有 x:Key,因此默认情况下它适用于所有 TreeViewItem,如果这对您不方便,因为您可能有不同的树和项目,您可以在 TreeView 级别显式分配样式 (ItemContainerStyle)
但是,您会看到它不会传播到 childrens :
但是,如果您为该样式中的 ItemContainerStyle 属性添加一个设置器,您可以看到它也被传播到子级。(自我参考)
<Window x:Class="WpfApplication5.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Width="382"
Height="159">
<Window.Resources>
<ContextMenu x:Key="menu" x:Shared="true">
<MenuItem Click="MenuItemOpen_Click" Header="_Open" />
</ContextMenu>
<Style x:Key="TreeViewItemStyle1" TargetType="{x:Type TreeViewItem}">
<Setter Property="ContextMenu" Value="{StaticResource menu}" />
<Setter Property="Background" Value="Red" />
<Setter Property="ItemContainerStyle" Value="{DynamicResource TreeViewItemStyle1}" />
</Style>
</Window.Resources>
<Grid>
<TreeView x:Name="treeView" ItemContainerStyle="{DynamicResource TreeViewItemStyle1}">
<TreeViewItem Header="item1" IsExpanded="True">
<TreeViewItem Header="item2" IsExpanded="True">
<TreeViewItem Header="item3" IsExpanded="True" />
</TreeViewItem>
</TreeViewItem>
</TreeView>
</Grid>
</Window>
最后但并非最不重要的一点是,如果您需要红色、蓝色或绿色项目的内容,您可以定义 ItemContainerStyleSelector 并仍然保留从样式中继承的内容。