Это потому, что ContentPresenter
создает TextBlock для строкового содержимого, и поскольку этот TextBlock отсутствует в визуальном дереве, он будет искать ресурс уровня приложения. А если вы определите стиль для TextBlock на уровне приложения, он будет применен к этим TextBlock в ControlControls.
Обходной путь должен определить DataTemplate
для System.String
, где мы можем явно использовать TextBlock по умолчанию для отображения содержимого. Вы можете поместить этот DataTemplate в тот же словарь, в котором вы определили стиль TextBlock, так что этот DataTemplate будет применен к любому ContentPresenter, на который влияет ваш стиль.
Добавьте это к своим ресурсам приложения, и оно должно работать для вас -
<DataTemplate DataType="{x:Type system:String}">
<TextBlock Text="{Binding}">
<TextBlock.Resources>
<Style TargetType="{x:Type TextBlock}"/>
</TextBlock.Resources>
</TextBlock>
</DataTemplate>
Объявите пространство имен в вашем xaml, если оно еще не указано -
xmlns:system="clr-namespace:System;assembly=mscorlib"
РЕДАКТИРОВАТЬ: Проверьте этот образец, где он работает ..
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="Red"/>
</Style>
<DataTemplate DataType="{x:Type system:String}">
<TextBlock Text="{Binding}">
<TextBlock.Resources>
<Style TargetType="{x:Type TextBlock}"/>
</TextBlock.Resources>
</TextBlock>
</DataTemplate>
<Style TargetType="{x:Type Button}">
<Setter Property="Foreground" Value="Yellow"/>
</Style>
<Style TargetType="{x:Type Label}">
<Setter Property="Foreground" Value="Blue"/>
</Style>