不同的" IsSelected" TreeView上每个节点的颜色

时间:2014-07-10 19:01:03

标签: c# wpf treeview treeviewitem

我有一个TreeView,它在层次结构中呈现了几种不同的数据类型。我在HierarchicalDataTemplate中定义了多个UserControl.Resources,我根据其数据类型使用它来改变每个节点的外观:

<UserControl.Resources>
    <HierarchicalDataTemplate DataType="{x:Type local:MyFirstType}" ItemsSource="{Binding Children}">
        ....
    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate DataType="{x:Type local:MySecondType}" ItemsSource="{Binding Children}">
        ....
    </HierarchicalDataTemplate>

    .... etc ....

</UserControl.Resources>

我希望每种类型的节点都有不同的悬停和选定的颜色。但是,我在更改这些颜色(for example, this question)时发现的所有示例都涉及更改一些系统定义的资源,例如HighlightBrushKey。由于我无法访问TreeViewItem生成的TreeView,因此如何在每个项目的基础上覆盖这些资源值?

1 个答案:

答案 0 :(得分:1)

我通过设置您提到的SystemColors来制作SelectedItem Background Transparent,然后在Border元素中声明我的项目,以便我可以单独设置Background颜色来实现这一目标使用DataTriggerRelativeSource Binding

<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />

...

<HierarchicalDataTemplate DataType="{x:Type local:MyFirstType}" 
    ItemsSource="{Binding Children}">
    <Border>
        <Border.Style>
            <Style TargetType="{x:Type Border}">
                <Setter Property="Background" Value="AliceBlue" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsSelected, RelativeSource={
                        RelativeSource AncestorType={x:Type TreeViewItem}}}" 
                        Value="True">
                        <Setter Property="Background" Value="LightGreen" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Border.Style>
    </Border>
    <!-- Your content here -->
</HierarchicalDataTemplate>