0

我在动态填充的树视图上有一个简单的上下文菜单。

如果我右键单击空白区域(最后一项下方),如何防止出现此上下文菜单?我尝试使用 ContextMenuOpening 事件,但它有问题并且没有引发。


            <TreeView.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="_Open" Click="MenuItemOpen_Click" />
                </ContextMenu>
            </TreeView.ContextMenu>
            <TreeView.ItemContainerStyle>
                <Style TargetType="TreeViewItem">
                    <Setter Property="IsExpanded" Value="True" />
                    <!-- Select node on right click : -->                        
                    <EventSetter Event="TreeViewItem.PreviewMouseRightButtonDown" Handler="TreeViewItem_PreviewMouseRightButtonDown"/>
                </Style>
            </TreeView.ItemContainerStyle>
4

2 回答 2

1

我不确定,但也许你可以结合你的 MouseEventArgs e 来测试它查看 HitTestResult

DependencyObject k = null;
var hitTest = VisualTreeHelper.HitTest(tv_treeview, e.GetPosition(tv_treeview));
        if(hitTest != null)
        {
            k = hitTest.VisualHit;
        }
于 2013-07-05T01:04:04.447 回答
1

你为什么不定义项目的上下文菜单呢?

您可以通过样式定义 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 并仍然保留从样式中继承的内容。

于 2013-07-05T01:09:56.197 回答