c# - 如何在不影响其子项的情况下将属性应用于控件

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

最佳答案

要获得所需的行为,您需要为 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. 在样式中为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)都被替换了!

  3. 在样式中为TreeViewItem找到 <MultiTrigger>有一个<Condition Property="IsSelected" Value="true"/>并替换

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

    <Setter TargetName="Bd" Property="Background" Value="Transparent"/>                                      
    

结果

在进行修改之前 TreeView看起来像这样:

enter image description here

修改后 TreeView 上的蓝色高亮显示在 ComboBox 上仍然可用时将消失:

enter image description here

关于c# - 如何在不影响其子项的情况下将属性应用于控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13739460/

相关文章:

C# Linq for files 用户具有读取权限

c# - 错误映射数据类型 Oracle 和 C#

c# - 如何将两个相似的具体对象传递给具有在 C# 中实现泛型的接口(interface)参数的方法?

c# - 未显示子类 UIAlertView

.net - 从 ASP.NET 切换到面包和黄油 HTML/jQuery 的优势

c# - 如何捕捉特殊的关键事件?

asp.net - Web API 2 POST 方法不允许使用 405 方法

wpf - WinRT 中的 ClipToBounds 属性

c# - WPF - 需要在禁用的 DataGrid 中启用滚动

wpf - ListView 数据绑定(bind)以显示用户控件