WPF DataGrid自定义CellStyle后选中行单元格变白问题求助
解决WPF DataGrid自定义CellStyle后选中行内容不可见问题
问题原因
你直接创建的Style没有继承DataGridCell的默认样式,覆盖了系统原本对选中状态的样式处理;同时未显式设置前景色,导致选中时文字变白,和背景色冲突无法查看。
解决方案
方法一:继承默认样式(推荐)
让自定义样式基于DataGridCell的默认样式,保留系统自带的选中、悬停等状态逻辑,再添加你的自定义设置:
// 创建样式时指定基于默认的DataGridCell样式 datagrid.Columns[colIndex].CellStyle = new Style(typeof(DataGridCell)) { BasedOn = (Style)datagrid.FindResource(typeof(DataGridCell)) }; // 添加自定义样式设置 datagrid.Columns[colIndex].CellStyle.Setters.Add(new Setter(Control.BackgroundProperty, (SolidColorBrush)new BrushConverter().ConvertFrom(colors[colorIndex]))); datagrid.Columns[colIndex].CellStyle.Setters.Add(new Setter(Control.BorderBrushProperty, (SolidColorBrush)new BrushConverter().ConvertFrom(colors[colorIndex]))); datagrid.Columns[colIndex].CellStyle.Setters.Add(new Setter(TextBlock.FontWeightProperty, FontWeights.Bold)); datagrid.Columns[colIndex].CellStyle.Setters.Add(new Setter(TextBlock.FontSizeProperty, 18.0)); // 显式设置前景色,避免选中时文字变白 datagrid.Columns[colIndex].CellStyle.Setters.Add(new Setter(TextBlock.ForegroundProperty, Brushes.Black)); datagrid.Columns[colIndex].IsReadOnly = true;
方法二:手动添加选中状态触发器
如果需要完全自定义选中状态的样式,可手动添加触发器指定选中时的背景和前景:
var cellStyle = new Style(typeof(DataGridCell)); // 基础样式设置 cellStyle.Setters.Add(new Setter(Control.BackgroundProperty, (SolidColorBrush)new BrushConverter().ConvertFrom(colors[colorIndex]))); cellStyle.Setters.Add(new Setter(Control.BorderBrushProperty, (SolidColorBrush)new BrushConverter().ConvertFrom(colors[colorIndex]))); cellStyle.Setters.Add(new Setter(TextBlock.FontWeightProperty, FontWeights.Bold)); cellStyle.Setters.Add(new Setter(TextBlock.FontSizeProperty, 18.0)); cellStyle.Setters.Add(new Setter(TextBlock.ForegroundProperty, Brushes.Black)); // 添加选中状态触发器 var isSelectedTrigger = new Trigger { Property = DataGridCell.IsSelectedProperty, Value = true }; // 选中时的背景(可替换为你想要的颜色) isSelectedTrigger.Setters.Add(new Setter(Control.BackgroundProperty, SystemColors.HighlightBrush)); // 选中时的前景色,确保文字清晰可见 isSelectedTrigger.Setters.Add(new Setter(TextBlock.ForegroundProperty, SystemColors.HighlightTextBrush)); cellStyle.Triggers.Add(isSelectedTrigger); datagrid.Columns[colIndex].CellStyle = cellStyle; datagrid.Columns[colIndex].IsReadOnly = true;
内容的提问来源于stack exchange,提问作者Berni
相关产品推荐
相关产品推荐

