我想创建一个全局样式,为DataGrid
或DataGridTextColumn
中的所有TextBlock
控件设置VerticalAlignment
到Center
。
我不想把以下内容复制到每个DataGridTextColumn
中,因为它感觉重复。
<DataGridTextColumn Header="Some Property" Binding="{Binding SomeProperty}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center"></Setter>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
我尝试了以下方法,但它不起作用,因为DataGridTextColumn
不是从FrameworkElement
或FrameworkContentElement
继承的。DataGrid
本身会这样做,但我尝试的任何进一步包装都会导致错误:
<Style TargetType="DataGridTextColumn">
<Setter Property="ElementStyle">
<Setter.Value>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
</Setter.Value>
</Setter>
</Style>
创建一个样式作为静态资源
<UserControl.Resources>
<Style x:Key="verticalCenter" TargetType="{x:Type TextBlock}">
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</UserControl.Resources>
然后您可以将其分配给DataGridTextColumn 的ElementStyle
<DataGridTextColumn ElementStyle="{StaticResource verticalCenter}" />
您可以如下定义CellStyle
:
<Style x:Key="DataGridCellStyle" TargetType="DataGridCell">
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
并将其分配给DataGrid:CellStyle="{StaticResource DataGridCellStyle}"
。这样,所有单元格都将以内容为中心。
EDIT:上面的代码来自我的一个项目,还包含删除DataGrid中网格线的代码。您可以通过在模板中将Grid
更改为Border
来取回它们。像这样:
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
只需使用DataGridTemplateColumn
:
<DataGridTemplateColumn Width="SizeToCells">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock HorizontalAlignment="Center" Width="100" Height="20"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>