WPF在DataGrid中全局样式化TextBlock

时间:2012-10-03 18:55:29

标签: wpf c#-4.0 wpfdatagrid

我遇到了一个非常奇怪的问题。我正在尝试将全局样式应用于DataGrid内的多个控件。他们中的大多数都完全按照我的期望工作。但是,TextBlock的样式永远不会被应用。 ComboBoxTextBoxLabel和其他几个样式的样式都将应用于各自的控件,但不会应用于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以外的任何控件的全局样式(TextBoxComboBox等)都能正常运行。
  • DataTemplate中定义全局样式将正常工作。
  • 使用TextBlock直接将样式分配给x:Key即可。
  • 使用DataGridCell的{​​{1}}的全局样式将应用于TextElement.PROPERTY

虽然其中一些会将样式应用于TextBlock,但它们有自己的问题。在TextBlock内直接指定样式或定义样式将意味着我将不止一次地应用样式。使用DataGridColumn上的TextElement.PROPERTY会将样式应用于DataGridCell以外的控件,并限制您可以设置的属性数。

2 个答案:

答案 0 :(得分:6)

因此,通过更多的挖掘和运气,我发现WPF不会在模板中应用隐式样式,除非TargetType派生自Control。由于TextBlock不是从Control派生的,因此不会应用其样式。因此,您必须手动将样式应用于每个非Control或在模板内定义隐式样式。

以下MSDN博客文章非常详细地解释了它。

http://blogs.msdn.com/b/wpfsdk/archive/2009/08/27/implicit-styles-templates-controls-and-frameworkelements.aspx

答案 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>