【转】[C#] WPF 保留选中的高亮色
转自:kimi
在 WPF 里,原生控件本身在失去焦点后都会默认取消视觉高亮,但可以通过修改系统画刷或自定义样式,让以下控件在失焦后仍然保留“选中”背景色:
✅ 常见支持“失焦仍高亮”的控件
| 控件 | 是否支持失焦保留选中背景 | 实现方式 |
|---|---|---|
| DataGrid | ✅ 支持 | 修改 InactiveSelectionHighlightBrushKey 系统画刷 |
| ListBox / ListBoxItem | ✅ 支持 | 自定义 Item.SelectedInactive.Background 画刷 |
| TreeViewItem | ✅ 支持 | 自定义样式中设置 SelectedInactive 背景色(类似 ListBox) |
| ListView | ✅ 支持 | 与 ListBox 类似,需自定义 ItemContainerStyle |
| 第三方 GridControl(如 DevExpress) | ✅ 支持 | 设置 FadeSelectionOnLostFocus="False" |
❌ 不支持失焦保留选中背景的控件
| 控件 | 原因 |
|---|---|
| TextBox、ComboBox、CheckBox 等输入控件 | 它们没有“选中项”概念,只有焦点状态,失焦后不会保留背景高亮 |
| UserControl | 除非你自己在模板里模拟选中状态,否则不会保留任何“选中”视觉 |
✅ 示例:DataGrid 失焦保留选中行背景色
<DataGrid>
<DataGrid.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="#FFCBE8F6"/>
</DataGrid.Resources>
</DataGrid>
✅ 示例:ListBoxItem 失焦保留背景色
<Style TargetType="ListBoxItem">
<Style.Resources>
<SolidColorBrush x:Key="Item.SelectedInactive.Background" Color="#CBE8F6"/>
</Style.Resources>
</Style>
✅ 小结
DataGrid、ListBox、TreeView、ListView 等“项容器型”控件,都可以通过样式或系统画刷,在失去焦点后仍然显示选中背景色。
而像 TextBox、Button 这类控件,没有“选中项”概念,也就谈不上“失焦保留选中背景”。
在 App.xaml 或系统主题里覆盖同名键即可:
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="{x:Static SystemColors.HighlightColor}" /> <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" Color="{x:Static SystemColors.HighlightTextColor}" />
常见使用场景
| 场景 | 说明 |
|---|---|
| DataGrid 失去焦点后行变灰 | 默认就是受此键控制 |
| ListBox / ListView 非活动选择色 | 同样受此键影响 |
| 想让它跟焦点内颜色一致 | 把此键覆盖成 HighlightBrushKey 的颜色即可 |
-
InactiveSelectionHighlightBrushKey/InactiveSelectionHighlightTextBrushKey:失去焦点后选中项的背景/前景色(文字颜色)。 -
HighlightBrushKey/HighlightTextBrushKey:控件拥有焦点时选中项的背景/前景色(文字颜色)。
浙公网安备 33010602011771号