2014-09-19 96 views
0

在WPF鼠標的亮點項目,當你有一個ListView越過一個項目用鼠標會給一個很好的高光效果,像這樣:WPF的TreeView:在

enter image description here

然而,這並未」與TreeView發生。我的問題很簡單:如何爲TreeView中的項目啓用相同的效果?

注:我知道這些問題: WPF TreeView Highlight Row On Hover Highlight whole TreeViewItem line in WPF

但他們主要關注的亮點行爲延伸到整個行,而我仍然無法弄清楚如何使亮點(對我來說可能綽綽有餘)

回答

3

通常,我們可以爲某些觸發器添加一些TreeViewItem的樣式以切換鼠標懸停在背景上。然而,當TreeViewItem包含對方(嵌套)並且事件的冒泡會導致一些不需要的效果時,它並非如此簡單。我試着用這種方法來解決問題,但沒有運氣(只是幾乎解決它,但不完美)。

所以我們必須使用另一種方法,在這裏我們將通過設置的TreeViewItem來更改標題的模板。在模板中,我們將添加觸發器,如根邊框上,然後一切正常OK:

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

請注意,您可以創建任何Brush你想更換簡單SolidColorBrush我用於上述Background。你應該在WPF中閱讀更多關於Brush的信息。

更新:據我所知,與顏色和畫筆的系統設置同步,我們只有靜態類SystemColors。我發現懸停高光的最接近的顏色是SystemColors.HotTrackColorKey。不過我猜想在Windows 7中用於ListView的盤旋突出顯示爲筆刷提供了一些不透明度,並且看起來更輕。所以,我一直在使用的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> 

然後通過Setter設置背景畫筆:

<Setter Property="Background" Value="{DynamicResource hoverBrush}"/> 
+0

這「有點兒」的作品,但它有兩個問題: 1)亮點刷只是一個顏色。有沒有一個畫筆可以提供很好的背景+邊框效果,就像我發佈的圖片一樣?或者我必須手動設置邊框? 2)如果你把鼠標懸停在樹上的一個子項目上,父項也會突出顯示,這看起來很奇怪 – 2014-09-19 11:00:58

+0

@Master_T我剛剛意識到有1個問題,這是懸停項目的父項也突出顯示(這可能不是你想要的),那麼另一個問題是什麼? – 2014-09-19 11:02:53

+0

我正在編輯,另一個問題正是你提到的。我讀過其他答案,應該通過將TargetName =「Bd」添加到setter的屬性來解決這個問題,但是這會破壞我的編譯(「不能在樣式設置器上設置TargetName屬性」) – 2014-09-19 11:05:31