【发布时间】:2012-10-03 18:55:29
【问题描述】:
我遇到了一个非常奇怪的问题。我正在尝试将全局样式应用于DataGrid 中的多个控件。他们中的大多数人完全按照我的期望工作。但是,TextBlock 的样式永远不会被应用。 ComboBox、TextBox、Label 和其他几个的样式都被应用到各自的控件,但不是 TextBlock。我已经尽可能地简化了代码,问题仍然存在。我在下面提供了代码示例。
我需要将样式应用于TextBlock,我不想手动将其应用于TextBlock。
<DataGrid ItemsSource="{Binding Data}" AutoGenerateColumns="False">
<DataGrid.Resources>
<Style TargetType="TextBlock">
<Setter Property="ANY_TEXTBLOCK_PROPERTY" Value="VALUE" />
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Test">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="Globably Applied" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
更多信息:
-
TextBlock(TextBox、ComboBox等)以外的任何控件的全局样式都可以正常工作。 - 在
DataTemplate中定义全局样式将正常工作。 - 使用
x:Key直接将样式分配给TextBlock即可。 - 使用
TextElement.PROPERTY的DataGridCell的全局样式将应用于TextBlock。
虽然其中一些会将样式应用于TextBlock,但它们也有自己的问题。在DataGridColumn 中的某处直接指定样式或定义样式将意味着我必须多次应用该样式。在DataGridCell 上使用TextElement.PROPERTY 将把样式应用于不仅仅是TextBlock 控件,并且会限制您可以设置的属性数量。
【问题讨论】:
-
只是为了了解发生了什么...如果将样式移动到 TextBlock 内,会发生什么?
-
该样式是否适用于不在 CellTemplate 中的常规文本块?
-
如果样式在
DataTemplate中定义,则应用该样式。如果直接应用于TextBlock,则应用该样式。如果TextBlock不在DataGrid内,则应用该样式。 -
有趣,会不会是一种应用于 datagrid 的样式,间接改变了 TextBlock 的样式?是否有应用于 Datagrid 的样式?
-
当您使用 WPF 应用程序检查工具(如我的 Snoop)时,
TextBlock没有应用样式。
标签: wpf c#-4.0 wpfdatagrid