0

如何创建一个上下文菜单,当用户右键单击我的树视图的元素时将显示该菜单?

我想获取被点击的项目的名称,这怎么可能?

这是我的树视图:

<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>
4

2 回答 2

1

根据许多因素ContextMenu,您可以通过多种方式添加一个。TreeViewItems例如,ContextMenu每个都相同TreeViewItem吗?从哪里来MenuItems

一种解决方案是将 a 添加ContextMenu到您的ItemContainerStyle. 您可以在您的或任何顶级控件中将其定义ContextMenu为资源,如下所示:Window

<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>

要获取被点击的项目,您需要单独处理。您可以使用 anEventSetter将事件附加到每个事件TreeViewItem,然后跟踪上次单击的项目,如下所示:

将此添加到样式的设置器中:

<EventSetter Event="MouseRightButtonDown" Handler="OnTreeItemClicked"/>

然后这在后面的代码中:

private void OnTreeItemClicked(object sender, MouseButtonEventArgs e)
{
    _item = sender as TreeViewItem;
    if (_item != null)
    {
        string header = _item.Header.ToString();
    }
}

这将为每个 . 添加相同的ContextMenu内容TreeViewItem,并对. 您当然可以变得更加灵活/动态/高级,但这应该为您提供入门的基础。MenuItemsContextMenu

于 2013-03-06T18:23:04.067 回答
1

更简单...将 ContextMenuStrip 从工具箱添加到设计视图。根据需要添加菜单选项(如果需要,重命名名称或将其保留在 ContextMenuStrip1。然后您所要做的就是在设计模式、属性中选择 TreeView,然后设置上下文菜单。

于 2013-07-14T18:28:39.767 回答