![](/img/trans.png)
[英]Add ContextMenu to TreeView with HierarchicalDataTemplate
[英]ContextMenu and TreeView
如何创建上下文菜单,当用户右键单击树视图的元素时,该菜单将显示?
我想得到被点击的项目的名称,这怎么可能?
这是我的树视图:
<TreeView Name="tvwResultados"
MouseMove="DataGrid_MouseMove"
MouseLeftButtonDown="DataGrid_PreviewMouseLeftButtonDown"
ItemTemplate="{StaticResource empresaTemplate}"
ItemsSource="{Binding Empresas}"
Padding="0,6,0,6"
Background="Black"
BorderBrush="Gray"
BorderThickness="1">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="4,2,4,2" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="BorderBrush" Value="Gray" />
</Trigger>
</Style.Triggers>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#171717" />
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Silver" />
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#333333" />
<SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Silver" />
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Gray" />
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" Color="Silver" />
</TreeView.Resources>
</TreeView>
根据许多因素,有几种方法可以将ContextMenu
添加到TreeViewItems
。 例如,每个TreeViewItem
的ContextMenu
是否相同? MenuItems
来自哪里?
一种解决方案是将ContextMenu
添加到ItemContainerStyle
。 您可以在Window
中将ContextMenu
定义为资源,或者顶层控件是这样的:
<Window.Resources>
<ContextMenu x:Key="TreeItemMenu">
<MenuItem Header="Menu Item 1" Click="MenuItem_Click_1"/>
<MenuItem Header="Menu Item 2" Click="MenuItem_Click_2"/>
</ContextMenu>
</Window.Resources>
然后你可以更新你的ItemContainerStyle
以使用这个ContextMenu
如下所示:
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="4,2,4,2" />
<Setter Property="ContextMenu" Value="{DynamicResource TreeItemMenu}"/>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="BorderBrush" Value="Gray" />
</Trigger>
</Style.Triggers>
</Style>
</TreeView.ItemContainerStyle>
要获取单击的项目,您需要单独处理。 您可以使用EventSetter
将事件附加到每个TreeViewItem
,然后跟踪上次单击的项目,如下所示:
将其添加到样式的setter中:
<EventSetter Event="MouseRightButtonDown" Handler="OnTreeItemClicked"/>
接下来是代码:
private void OnTreeItemClicked(object sender, MouseButtonEventArgs e)
{
_item = sender as TreeViewItem;
if (_item != null)
{
string header = _item.Header.ToString();
}
}
这将为每个TreeViewItem
添加相同的ContextMenu
,并对MenuItems
硬编码,但它演示了如何添加ContextMenu
。 您当然可以获得更灵活/动态/高级,但这应该为您提供入门的基础。
更简单...将ContextMenuStrip从工具箱添加到设计视图。 根据需要添加菜单选项(如果您愿意,可以重命名名称或将其留在ContextMenuStrip1。然后您只需在设计模式,属性中选择TreeView,然后设置上下文菜单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.