WPF在DataGrid中全局样式化TextBlock

Bry*_*tts 12 wpf wpfdatagrid c#-4.0

我遇到了一个非常奇怪的问题.我正在尝试将全局样式应用于a中的几个控件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>
Run Code Online (Sandbox Code Playgroud)

更多信息:

  • 比其他任何控制全局样式TextBlock(TextBox,ComboBox,等)的正常工作.
  • 定义内部的全局样式DataTemplate将正常工作.
  • 直接将样式分配给TextBlock使用x:Key将工作.
  • 全局DataGridCell使用样式TextElement.PROPERTY将应用于TextBlock.

虽然其中一些将适用于该风格TextBlock,但它们有自己的问题.直接指定样式或在a中某处定义样式DataGridColumn意味着我将不止一次地应用样式.使用TextElement.PROPERTYon DataGridCell将将样式应用于不仅仅是TextBlock控件,并将限制您可以设置的属性数.

Bry*_*tts 7

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

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

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