WPF全球造型一个DataGrid中一个TextBlock(WPF globally styling

2019-08-01 03:06发布

我遇到一个很奇怪的问题。 我想一个全球范围内的造型适用于几个控件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>

更多信息:

  • 比其他任何控制全局样式TextBlockTextBoxComboBox等)的正常工作。
  • 定义里面的全局样式DataTemplate将正常工作。
  • 直接指派风格到TextBlock使用x:Key会工作。
  • 全球风格DataGridCell使用TextElement.PROPERTY将得到应用于TextBlock

虽然其中一些会得到应用于风格TextBlock ,他们那边有自己的问题。 直接分配样式或某处定义中的风格DataGridColumn将意味着我将要应用的样式不止一次。 使用TextElement.PROPERTYDataGridCell将样式应用于不仅仅是TextBlock控制,并将于限制,你可以设置属性的数量。

Answer 1:

因此,与多一点挖一点点运气,我发现,WPF不适内模板隐式的风格,除非TargetType派生自Control 。 由于TextBlock不会得到Control ,其风格不适用。 所以,你要么必须样式手动应用到每个非Control或定义模板里面隐含的风格。

以下MSDN博客文章解释了它在相当不错的细节。

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



Answer 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>


文章来源: WPF globally styling a TextBlock inside a DataGrid