15

我遇到了一个非常奇怪的问题。我正在尝试将全局样式应用于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将正常工作。
  • 直接将样式分配给TextBlockusingx:Key将起作用。
  • DataGridCell使用的全局样式TextElement.PROPERTY将应用于TextBlock.

虽然其中一些会将样式应用于 . TextBlock,但它们也有自己的问题。直接指定样式或在 a 中的某处定义样式DataGridColumn意味着我将不得不多次应用该样式。使用TextElement.PROPERTYonDataGridCell将样式应用到的不仅仅是TextBlock控件,并且会限制您可以设置的属性数量。

4

2 回答 2

9

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

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

https://docs.microsoft.com/en-us/archive/blogs/wpfsdk/implicit-styles-templates-controls-and-frameworkelements

于 2012-10-16T23:13:50.287 回答
3

不幸的是,就像 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>
于 2012-10-06T09:53:23.147 回答