我想创建一种全局样式,将VerticalAlignment
或Center
内所有TextBlock
控件的DataGrid
设置为DataGridTextColumn
。
我不想将以下内容复制到每个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>
最佳答案
您可以如下定义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}"
。这样,您所有的单元格都将以内容为中心。
编辑:上面的代码来自我的项目之一,还包含删除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>