在 DataGridTextColumn 中为 TextBlock 创建样式
Posted
技术标签:
【中文标题】在 DataGridTextColumn 中为 TextBlock 创建样式【英文标题】:Create style for TextBlock in DataGridTextColumn 【发布时间】:2013-12-19 13:46:26 【问题描述】:我想为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>
【问题讨论】:
【参考方案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 属性
如何在 WPF 中将 DatePicker 添加到 DataGridTextColumn
DataGridTextColumn.IsReadOnly 似乎有问题