在 WPF 中,当你ListView用鼠标经过一个项目时会产生很好的高光效果,如下所示:

但是,这不会发生在TreeView. 我的问题很简单:如何为 a 中的项目启用相同的效果TreeView?
注意:我知道这些问题: WPF TreeView Highlight Row On Hover 在 WPF 中突出显示整个 TreeViewItem 行
但他们主要关心的是将高光行为扩展到整行,而我仍然无法弄清楚如何在单个上启用高光效果TreeViewItem(这对我来说已经足够了)
通常我们可以为TreeViewItemTrigger添加一些样式以在鼠标悬停时切换背景。然而,当TreeViewItem相互包含(嵌套)并且事件的冒泡会导致一些不需要的影响时,事情就不是那么简单了。我试过用这种方法来解决问题,但没有运气(几乎解决了它,但并不完美)。
所以我们不得不使用另一种方法,这里我们将通过设置HeaderTemplateof来更改 Header 的模板TreeViewItem。在该模板中,我们将为根边框添加触发器,然后一切正常:
<TreeView>
<TreeView.Resources>
<Style TargetType="TreeViewItem">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<Border>
<TextBlock Text="{Binding}"/>
<Border.Style>
<Style TargetType="Border">
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self},
Path=IsMouseOver}" Value="True"/>
<Condition Binding="{Binding RelativeSource={RelativeSource AncestorType=TreeViewItem},
Path=IsSelected}" Value="False"/>
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="#ffe5f3fb"/>
<Setter Property="BorderBrush" Value="#ffa5d7f0"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
</Border>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</TreeView.Resources>
<TreeViewItem Header="Item 1">
<TreeViewItem Header="Item 11"></TreeViewItem>
<TreeViewItem Header="Item 12"/>
</TreeViewItem>
<TreeViewItem Header="Item 2">
</TreeViewItem>
</TreeView>
Run Code Online (Sandbox Code Playgroud)
请注意,您可以创建任何Brush您喜欢的内容来替换SolidColorBrush我上面用于Background. 您应该Brush在 WPF 中阅读更多相关信息。
更新:据我所知,要与有关颜色和画笔的系统设置同步,我们只有静态类SystemColors。我为悬停高光找到的最接近的颜色是SystemColors.HotTrackColorKey。但是我猜ListView在 Windows 7 中使用的悬停高光为画笔应用了一些不透明度,它看起来更轻。所以我尝试使用0.05画笔的不透明度,它看起来非常接近 Windows 7 中 ListView 的默认高亮颜色。您可以在资源中定义画笔并像这样使用它:
//inside the Style for Border
<Style.Resources>
<SolidColorBrush x:Key="hoverBrush" Opacity=".05"
Color="{DynamicResource {x:Static SystemColors.HotTrackColorKey}}"/>
</Style.Resources>
Run Code Online (Sandbox Code Playgroud)
然后通过Setter以下方式设置背景画笔:
<Setter Property="Background" Value="{DynamicResource hoverBrush}"/>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7628 次 |
| 最近记录: |