WPF DataGrid失去焦点时自定义DataGridRow样式失效,如何修改HighlightBrush颜色
WPF DataGrid自定义高亮行颜色解决方案
结论
可以自定义HighlightBrush相关颜色,无需局限于系统默认浅蓝,同时也有不需要依赖系统HighlightBrush的替代方案实现稳定的行样式效果。
方案1:重写系统高亮画刷资源
仅需在对应DataGrid的资源字典中覆盖系统高亮相关的画刷键值即可,局部修改仅作用于当前DataGrid,不会影响项目内其他控件:
<DataGrid.Resources> <!-- 控件处于焦点状态下选中行的背景色 --> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#你的自定义颜色值"/> <!-- 控件失去焦点状态下选中行的背景色,解决失焦样式失效问题 --> <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="#你的自定义颜色值"/> <!-- 可选:同步修改对应状态下的文本颜色,避免对比度不足 --> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="White"/> <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" Color="White"/> </DataGrid.Resources>
如果需要全局生效,将上述资源放到App.xaml的<Application.Resources>节点中即可。
方案2:直接自定义行样式(无需依赖系统画刷)
如果你的需求是满足业务条件的行无论是否选中都要展示特殊背景色,可以直接在DataGrid.RowStyle中显式声明所有状态的样式,优先级高于默认控件样式,从根源避免失焦失效问题:
<DataGrid.RowStyle> <Style TargetType="DataGridRow"> <!-- 业务条件触发的行样式示例:绑定数据源的IsAbnormal字段 --> <DataTrigger Binding="{Binding IsAbnormal}" Value="True"> <Setter Property="Background" Value="#FFF5C0C0"/> </DataTrigger> <!-- 选中且控件有焦点时的样式 --> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="#你的自定义颜色值"/> <Setter Property="Foreground" Value="White"/> </Trigger> <!-- 选中但控件失去焦点时的样式,专门解决失焦失效问题 --> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsSelected" Value="True"/> <Condition Property="Selector.IsSelectionActive" Value="False"/> </MultiTrigger.Conditions> <Setter Property="Background" Value="#你的自定义颜色值"/> <Setter Property="Foreground" Value="White"/> </MultiTrigger> </Style> </DataGrid.RowStyle>
原问题根因说明
之前设置的行样式失焦失效,是因为WPF DataGrid默认样式中,「选中且失焦」状态的背景属性优先级高于普通的Background赋值,只要显式覆盖该状态的样式或者对应的系统画刷,就可以实现稳定的样式效果。
内容的提问来源于stack exchange,提问作者axaros
相关产品推荐
相关产品推荐

