WPF如何为所有DataGrid列统一设置单元格样式以减少冗余代码
方案1:使用隐式样式全局生效(最简便,推荐)
直接在DataGrid的资源字典中定义无x:Key的隐式样式,只要TargetType匹配,当前DataGrid下所有对应控件会自动继承样式,不需要逐列指定。
示例代码:
<DataGrid> <DataGrid.Resources> <!-- 所有DataGridCell自动应用该样式 --> <Style TargetType="DataGridCell"> <Setter Property="Focusable" Value="False"/> <Setter Property="HorizontalContentAlignment" Value="Center"/> <Setter Property="VerticalContentAlignment" Value="Center"/> </Style> <!-- 所有DataGridTextColumn中的TextBlock自动应用该样式 --> <Style TargetType="TextBlock"> <Setter Property="FontFamily" Value="Noto Sans"/> </Style> </DataGrid.Resources> <DataGrid.Columns> <!-- 完全和旧写法一致,单行声明列即可,样式自动生效 --> <DataGridTextColumn Header="Section Type" Binding="{Binding SectionType}"/> <DataGridTextColumn Header="Liquid Density, kg/m^3" Binding="{Binding LiquidDensity}"/> <!-- 剩余30+列全部按该格式声明即可,无冗余代码 --> </DataGrid.Columns> </DataGrid>
如果需要全局所有DataGrid都应用该规则,将上述DataGrid.Resources中的样式移到App.xaml的资源字典中即可。
方案2:自定义列类型(适合需要区分不同列样式的场景)
如果部分列需要用特殊样式,大部分列使用通用规则,可以自定义继承DataGridTextColumn的列类型,将默认样式封装在类中:
自定义列代码
using System.Windows; using System.Windows.Controls; using System.Windows.Media; public class CommonTextColumn : DataGridTextColumn { private static readonly Style _elementStyle; private static readonly Style _cellStyle; static CommonTextColumn() { // 初始化文本样式 _elementStyle = new Style(typeof(TextBlock)); _elementStyle.Setters.Add(new Setter(TextBlock.FontFamilyProperty, new FontFamily("Noto Sans"))); _elementStyle.Seal(); // 初始化单元格样式 _cellStyle = new Style(typeof(DataGridCell)); _cellStyle.Setters.Add(new Setter(DataGridCell.FocusableProperty, false)); _cellStyle.Setters.Add(new Setter(DataGridCell.HorizontalContentAlignmentProperty, HorizontalAlignment.Center)); _cellStyle.Setters.Add(new Setter(DataGridCell.VerticalContentAlignmentProperty, VerticalAlignment.Center)); _cellStyle.Seal(); } public CommonTextColumn() { ElementStyle = _elementStyle; CellStyle = _cellStyle; } }
XAML使用示例
先引入自定义类所在的命名空间(假设命名空间为YourApp.Controls):
<Window xmlns:controls="clr-namespace:YourApp.Controls"> <DataGrid> <DataGrid.Columns> <controls:CommonTextColumn Header="Section Type" Binding="{Binding SectionType}"/> <controls:CommonTextColumn Header="Liquid Density, kg/m^3" Binding="{Binding LiquidDensity}"/> <!-- 需要特殊样式的列用原生DataGridTextColumn即可 --> </DataGrid.Columns> </DataGrid> </Window>
内容的提问来源于stack exchange,提问作者ktototamov
相关产品推荐
相关产品推荐

