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>