在DataGridTextColumn中为TextBlock创建样式

15

我想创建一个全局样式,将所有在 DataGridDataGridTextColumn 中的 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 没有继承自 FrameworkElementFrameworkContentElementDataGrid 本身有继承,但是任何我尝试进行的进一步包装都会导致错误:

<Style TargetType="DataGridTextColumn">
    <Setter Property="ElementStyle">
        <Setter.Value>
            <Style TargetType="TextBlock">
                <Setter Property="VerticalAlignment" Value="Center"/>
            </Style>
        </Setter.Value>
    </Setter>
</Style>
3个回答

25

创建静态资源样式

<UserControl.Resources>
    <Style x:Key="verticalCenter" TargetType="{x:Type TextBlock}">
        <Setter Property="VerticalAlignment" Value="Center" />
    </Style>
</UserControl.Resources>

然后您可以将其分配给DataGridTextColumn的ElementStyle

<DataGridTextColumn ElementStyle="{StaticResource verticalCenter}" />

如果我在app.xaml内定义资源,我还能以任何方式引用它吗? - C4d
1
应该可以直接使用,例如请参考http://www.wpf-tutorial.com/wpf-application/resources/,了解您的选项的详细概述。 - Michael Spranger

13

您可以按如下方式定义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>

1
因为我想在任何地方都能应用它,所以我删除了x:Key属性。现在它可以工作了。但是它做得太多了。当我选择一行时,整行的文本都消失了(Foreground="White"?)。有什么想法吗? - timmkrause
@timmkrause 你改变了 Background 吗?默认情况下,当你选择一行时,前景色变为白色,背景色变为蓝色。 - Gildor
那在更改之前是正确的。前景变成了白色,而背景仍然是白色。我删除了Background =“{TemplateBinding Background}”来测试一下并检查我是否真的需要它。我确实需要它!现在它可以工作了!你能解释一下这个绑定在做什么吗? - timmkrause
1
@timmkrause 你可以在谷歌上搜索“TemplateBinding”,有很多关于它的文章。对于这里的用法,它意味着Background值绑定到应用模板的元素——DataGridCell的Background。当行被触发器选中时,DataGridCell的Background将被设置为蓝色。您可以使用Blend来检查默认样式中触发器的定义。 - Gildor
顺便说一下,我上面提到的样式是来自我的项目,并且它还包含了在DataGrid中删除网格线的更改。您可以在模板中将Grid更改为Border以恢复它们。 - Gildor
谢谢,帮了很大的忙。 - timmkrause

2

只需使用DataGridTemplateColumn

<DataGridTemplateColumn Width="SizeToCells">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock HorizontalAlignment="Center" Width="100" Height="20"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接