Материал, который работает
Мне нужно стилизовать элементы управления определенного типа, которые являются дочерними элементами StackPanel. Я использую:
<StackPanel>
<StackPanel.Resources>
<Style TargetType="{x:Type TextBlock}">...</Style>
</StackPanel.Resources>
<TextBlock ...>
...
</StackPanel>
И это отлично работает! Каждый TextBlock ищет ресурсы этого родителя (StackPanel), чтобы узнать, как его следует стилизовать. Не имеет значения, как далеко вы вложите TextBlock в StackPanel... если он не найдет стиль в своем прямом родителе, он будет смотреть на родительский родитель и так далее, пока не найдет что-то (в этом случае, стиль, который был определен в).
Материал, который не работает
У меня возникла проблема, когда я вложил TextBlock внутри ContentControl, у которого был шаблон (см. код ниже). ControlTemplate, похоже, нарушает способ, которым TextBlock получает свой стиль от своих родителей, дедушек и бабушек,...
Использование ControlTemplate эффективно, похоже, выбивает холодное средство TextBlock для поиска его законного стиля (тот, что находится в StackPanel.Resources). Когда он сталкивается с ControlTemplate, он перестает искать свой стиль в ресурсах до дерева и вместо этого по умолчанию использует стиль в MergedDictionaries самого приложения.
<StackPanel Orientation="Vertical" Background="LightGray">
<StackPanel.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="Green" />
</Style>
</StackPanel.Resources>
<TextBlock Text="plain and simple in stackpanel, green" />
<ContentControl>
<TextBlock Text="inside ContentControl, still green" />
</ContentControl>
<ContentControl>
<ContentControl.Template>
<ControlTemplate TargetType="{x:Type ContentControl}">
<StackPanel Orientation="Vertical">
<ContentPresenter />
<TextBlock Text="how come this one - placed in the template - is not green?" />
</StackPanel>
</ControlTemplate>
</ContentControl.Template>
<TextBlock Text="inside ContentControl with a template, this one is green as well" />
</ContentControl>
</StackPanel>
Есть ли способ - помимо дублирования стиля в StackPanel.Resources для ControlTemplate.Resources - чтобы заставить TextBlock внутри этого элемента управления ControlTemplate найти определенный стиль?
Спасибо...