如何将属性应用于控件,而不影响其子级

时间:2012-12-06 08:13:56

标签: c# .net wpf xaml mvvm

我有一个TreeView,其突出显示禁用如下:

<TreeView Name="tvFilters" Margin="0,10,0,10" Background="White" BorderBrush="White">
            <TreeView.Resources>
                <!-- Disables the blue highlighting when a TreeViewItem is clicked -->
                <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}">
                    Transparent
                </SolidColorBrush> 
            </TreeView.Resources>
 </TreeView>

编辑:这是我的TreeView的一部分 - 注意点击TreeViewItem后开发的灰色区域:

enter image description here

这是另一个:

enter image description here

1 个答案:

答案 0 :(得分:4)

要获得所需的行为,您需要为TreeViewItem提供新的默认样式和模板。在此模板中,您可以更改突出显示项目的背景颜色,而不会影响TreeViewItem的所有子项的背景。

您可以在MSDN中找到包含模板的样式示例:TreeViewItem ControlTemplate Example

第一步:将样式添加到您的应用程序中

您需要为TreeView提供可用的样式和模板。因此,从网站复制XAML并将其粘贴到TreeView

的参考资料部分
<TreeView x:Name="tvFilters" ...>
    <TreeView.Resources>

        <!-- paste copied styles here -->

    </TreeView.Resources>
</TreeView>

注意:确保您还复制了所提供示例底部​​的SolidColorBrush名为GlyphBrush的内容。否则你的代码将无效。

第二步:修改代码,使其符合您的需求

要使代码按您的意愿工作,您需要进行一些修改。

  1. 从以下行中删除x:Key="{x:Type TreeViewItem}"

    <Style x:Key="{x:Type TreeViewItem}" TargetType="{x:Type TreeViewItem}">
    

    所以它看起来像

    <Style TargetType="{x:Type TreeViewItem}">
    

    这会将样式应用于TreeView

  2. 中的所有项目
  3. TreeViewItem的样式中找到<Trigger Property="IsSelected" Value="true">并替换

    <Setter TargetName="Bd"
            Property="Background"
            Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
    <Setter Property="Foreground" 
            Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
    

    <Setter TargetName="Bd"
            Property="Background"
            Value="Transparent" />
    <Setter Property="Foreground" 
            Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    

    注意:正在替换这两个值(ForegroundBackground)!

  4. TreeViewItem的样式中找到<MultiTrigger>的{​​{1}}并替换

    <Condition Property="IsSelected" Value="true"/>

    <Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
    
  5. 结果

    在进行修改之前,<Setter TargetName="Bd" Property="Background" Value="Transparent"/> 将如下所示:

    enter image description here

    进行修改后,TreeView上的蓝色突出显示将在TreeView上仍然可用时消失:

    enter image description here