我想创建一种全局样式,将VerticalAlignmentCenter内所有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不能从FrameworkElementFrameworkContentElement继承而无法使用。 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>

09-25 20:11