首先介紹一種簡單地方法:就是通過自定義SystemColors類的參數來自定義WPF ListBox選擇顏色的,
SystemColors的HighlightBrushKey和HighlightTextBrushKey分別代表ListBoxItem被選中時文字和背景顏色,
沒有Highlight的BrushKey代表ListBox沒有焦點時的選中項文字和背景顏色,如下示例代碼:
<ListBox>
<ListBox.Resources>
<Style TargetType="ListBoxItem">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Pink"/>
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Gray"/>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Red"/>
<SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Green"/>
</Style.Resources>
</Style>
</ListBox.Resources>
<ListBoxItem>AAA</ListBoxItem>
<ListBoxItem>B</ListBoxItem>
<ListBoxItem>ccc</ListBoxItem>
</ListBox>
這樣的話,ListBox選中顏色變成了這樣:
可是這種方法僅僅能改變統一的顏色,無法完成其他更多要求。
那么另一種更強大的方法就是在模板中定義。一種方法就是在控件模板中根據ListBoxItem的IsSelected屬性判斷是否被選中,然后利用WPF觸發器來設置被選中后的樣式。但是如果你的ListBox定義了數據模板的話你會發現數據模板是顯示在控件模板之上的,因此控件模板上的某些顯示元素會被數據模板蓋住,如果此類情況發生,那么只能在數據模板上添加選中后的元素設置。這里可以通過一個RelativeBinding = FindAncestor的綁定來尋找可視化樹中的ListBoxItem的IsSelected屬性來在數據模板中判斷ListBoxItem是否被選中,可參見“文件”選項卡中上傳的示例源碼。