WPF TreeView:鼠标悬停时突出显示项目

Mas*_*r_T 0 wpf treeview

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

在此处输入图片说明

但是,这不会发生在TreeView. 我的问题很简单:如何为 a 中的项目启用相同的效果TreeView

注意:我知道这些问题: WPF TreeView Highlight Row On Hover 在 WPF 中突出显示整个 TreeViewItem 行

但他们主要关心的是将高光行为扩展到整行,而我仍然无法弄清楚如何在单个上启用高光效果TreeViewItem(这对我来说已经足够了)

Kin*_*ing 6

通常我们可以为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)