我遇到了一个非常奇怪的问题。我正在尝试将全局样式应用于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
中定义全局样式将正常工作。TextBlock
直接将样式分配给x:Key
即可。DataGridCell
的{{1}}的全局样式将应用于TextElement.PROPERTY
。虽然其中一些会将样式应用于TextBlock
,但它们有自己的问题。在TextBlock
内直接指定样式或定义样式将意味着我将不止一次地应用样式。使用DataGridColumn
上的TextElement.PROPERTY
会将样式应用于DataGridCell
以外的控件,并限制您可以设置的属性数。
答案 0 :(得分:6)
因此,通过更多的挖掘和运气,我发现WPF不会在模板中应用隐式样式,除非TargetType
派生自Control
。由于TextBlock
不是从Control
派生的,因此不会应用其样式。因此,您必须手动将样式应用于每个非Control
或在模板内定义隐式样式。
以下MSDN博客文章非常详细地解释了它。
答案 1 :(得分:2)
不幸的是,就像BrianP所说的那样,WPF不会这样。但是,可以按如下方式设置单元格样式的TextElement属性:
<DataGrid ItemsSource="{Binding Data}" AutoGenerateColumns="False" DockPanel.Dock="Top">
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="TextElement.Foreground" Value="Green" />
</Style>
</DataGrid.CellStyle>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Test">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="not globably applied" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>