WPF глобально укладывает TextBlock внутри DataGrid

Я встречаюсь с очень странной проблемой. Я пытаюсь применить глобальный стиль к нескольким элементам управления в пределах 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 с использованием TextElement.PROPERTY будут применены к TextBlock.

В то время как некоторые из них получат стиль, применяемый к TextBlock, у них есть собственные проблемы. Непосредственное назначение стиля или определение стиля где-то внутри DataGridColumn означает, что мне придется применять стиль более одного раза. Использование TextElement.PROPERTY в DataGridCell применит стиль к нескольким элементам управления TextBlock и ограничит количество свойств, которые вы можете установить.

Ответ 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

Ответ 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>