当TreeViewItem包含DropShadowEffect的边框时,如何应用TreeView高亮颜色?

时间:2018-05-29 13:02:20

标签: wpf treeview treeviewitem dropshadow

情况:

我想在DropShadowEffect周围TreeViewItem,同时我希望TreeViewItem在选中时更改颜色。

问题:

如果DropShadowEffect未应用于TreeViewItem中的文字,我需要在包含Background="White"的边框上设置DropShadowEffect,这似乎会覆盖选中时突出显示TreeViewItem

我可以正确应用DropShadowEffect,如下例所示:

enter image description here

或者我可以在选择时正确突出显示,但在文本上留下阴影,如下例所示:

enter image description here

问题:

有没有办法保持TreeView的突出显示可能性,同时保持DropShadowEffect不适用TreeViewItem中的文字?

到目前为止我尝试了什么:

  1. 我尝试按照您在下面看到的样式设置Panel.ZIndex的{​​{1}},如TreeViewItem
  2. 我尝试使用两个占用相同空间的边框,就像在这个tutorial中一样。
  3. 加法:

    我无法在<Setter Property="Panel.ZIndex" Value="5"/>上应用白色背景,因为我的边框周围有圆角,TreeViewItem的完美方形背景不尊重。

    我不希望将TreeViewItem应用于DropShadowEffect按钮。

    最小(非 - )工作示例:

    树视图:

    Expander

    VM:

    <Window x:Class="TreeViewDropShadowExampl.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:TreeViewDropShadowExampl"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
    
        <TreeView ItemsSource="{Binding Root}" MinWidth="100" MinHeight="100">
            <TreeView.Resources>
    
                <HierarchicalDataTemplate DataType="{x:Type local:Node}" ItemsSource="{Binding Children}">
                    <Grid>
                        <Border BorderBrush="Gray">
                            <TextBlock Text="{Binding ID}"/>
                            <Border.Effect>
                                <DropShadowEffect Color="Gray" BlurRadius="2"/>
                            </Border.Effect>
                        </Border>
                    </Grid>             
                </HierarchicalDataTemplate>
    
                <Style TargetType="{x:Type TreeViewItem}">
                    <Setter Property="Margin" Value="2" />
                </Style>
    
            </TreeView.Resources>
        </TreeView>
    </Window>
    

    节点

    using System.Collections.ObjectModel;
    
    namespace TreeViewDropShadowExampl
    {
        class VM 
        {
            public VM()
            {
                var root = new Node("1");
                Root.Add(root);
                for (int i = 1; i < 4; i++)
                {
                    Node newNode = new Node("1." + i.ToString());
                    for (int j = 1; j < 4; j++)
                    {
                        newNode.Children.Add(new Node("1." + i.ToString() + "." + j.ToString()));
                    }
                    root.Children.Add(newNode);
                }
            }
    
            public ObservableCollection<Node> Root { get; set; } = new ObservableCollection<Node>();
        }
    }
    

1 个答案:

答案 0 :(得分:1)

不是将效果应用于数据模板内的npm install --save amplement-primus,而是将效果应用于整个项目:

Border

不要忘记从数据模板<TreeView> <TreeView.ItemContainerStyle> <Style TargetType="TreeViewItem"> <Style.Triggers> <Trigger Property="IsSelected" Value="False"> <Setter Property="Background" Value="White"/> </Trigger> </Style.Triggers> <Setter Property="Effect"> <Setter.Value> <DropShadowEffect Color="Gray" BlurRadius="2"/> </Setter.Value> </Setter> </Style> </TreeView.ItemContainerStyle> </TreeView> 中移除效果。
或者甚至完全删除Border,如果你只需要阴影效果。

<强>更新

您也可以将白色背景应用于该项目。只需在触发器中进行操作即可确保仅在未选择项目时才会出现。

更新2:

拥有所有新要求,这里是您问题的完整解决方案。

首先,可以使用圆角选择矩形 - 您只需要更改选区边框的样式。

Border