通常,我們可以爲某些觸發器添加一些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}"/>
這「有點兒」的作品,但它有兩個問題: 1)亮點刷只是一個顏色。有沒有一個畫筆可以提供很好的背景+邊框效果,就像我發佈的圖片一樣?或者我必須手動設置邊框? 2)如果你把鼠標懸停在樹上的一個子項目上,父項也會突出顯示,這看起來很奇怪 – 2014-09-19 11:00:58
@Master_T我剛剛意識到有1個問題,這是懸停項目的父項也突出顯示(這可能不是你想要的),那麼另一個問題是什麼? – 2014-09-19 11:02:53
我正在編輯,另一個問題正是你提到的。我讀過其他答案,應該通過將TargetName =「Bd」添加到setter的屬性來解決這個問題,但是這會破壞我的編譯(「不能在樣式設置器上設置TargetName屬性」) – 2014-09-19 11:05:31