在 DataGridTextColumn 中为 TextBlock 创建样式

Posted

技术标签:

【中文标题】在 DataGridTextColumn 中为 TextBlock 创建样式【英文标题】:Create style for TextBlock in DataGridTextColumn 【发布时间】:2013-12-19 13:46:26 【问题描述】:

我想为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 没有从FrameworkElementFrameworkContentElement 继承。 DataGrid 本身可以,但我尝试的任何进一步包装都会导致错误:

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

【问题讨论】:

【参考方案1】:

将样式创建为静态资源

<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 中定义资源怎么办?我还能以任何方式提及它吗? 这应该是开箱即用的,参见例如wpf-tutorial.com/wpf-application/resources 了解您的选择。【参考方案2】:

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

【讨论】:

因为我想在任何地方应用它,我删除了 x:Key 属性。现在可以了。但它做的太多了。当我选择一行时,该行中的整个文本都会消失(Foreground="White"?)。有什么想法吗? @timmkrause 您是否更改了Background?默认情况下,当您选择一行时,前景变为白色,背景为蓝色。 在更改之前是正确的。前景变成白色,背景保持白色。我删除了 Background="TemplateBinding Background" 来测试并检查我是否真的需要它。我确实需要它!现在它起作用了!你能解释一下这个绑定在做什么吗? @timmkrause 你可以用谷歌搜索TemplateBinding 并且有很多关于它的文章。对于此处的用法,这意味着Background 值绑定到模板应用到的元素的Background - DataGridCell。当触发器选择行时,DataGridCell 的Background 将设置为蓝色。您可以使用 Blend 来检查默认样式中触发器的定义。 顺便说一下,我上面的样式来自我的项目,它还包含在 DataGrid 中删除网格线的更改。您可以将模板中的Grid 更改为Border 以将其取回。【参考方案3】:

只需使用DataGridTemplateColumn

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

【讨论】:

以上是关于在 DataGridTextColumn 中为 TextBlock 创建样式的主要内容,如果未能解决你的问题,请参考以下文章

在 DataGridTextColumn 中绑定 ViewModel 属性

如何将工具提示添加到 DataGridTextColumn

如何在 WPF 中将 DatePicker 添加到 DataGridTextColumn

DataGridTextColumn.IsReadOnly 似乎有问题

为啥我不能设置 DataGridTextColumn 的样式?

如何在UWP [XAML]中隐藏列格式DataGridTextColumn?