Кажется, что что-то странное с TextBlock.Foreground в WPF начиная с 3.5, см .:
Я нашел обходной путь, используя EventSetters и некоторый код для ResourceDictionary. Это не красиво, но придется делать, если я хочу, чтобы мои стили были независимы от основного приложения. Я опубликую это здесь, так как это может быть кому-то полезно, и я оставлю вопрос открытым, если кто-то отправит правильный (или лучший) ответ.
Обход
В XAML ResorceDictionary (например, Generic.xaml) добавьте свойство Class следующим образом:
<!-- Generic.xaml -->
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Presenter.Themes.Generic">
Затем добавьте файл codebehind cs (например, Generic.xaml.cs) с частичным классом, указанным в свойстве Class в ResourceDictionary:
// Generic.xaml.cs
partial class Generic { }
В соответствующем стиле ResourceDictionary добавьте EventSetter для события Loaded:
<!-- Generic.xaml -->
<Style TargetType="{x:Type TextBlock}" x:Key="HeadText">
<EventSetter Event="Loaded" Handler="OnHeadTextLoaded"/>
<Setter .../>
<Setter .../>
<Setter .../>
</Style>
В Generic.xaml.cs добавить обработчик для события Loaded и установить желаемый Foreground
//Generic.xaml.cs
public void OnHeadTextLoaded(object sender, EventArgs args)
{
var textBlock = sender as TextBlock;
if (textBlock == null) return;
textBlock.Foreground = new SolidColorBrush(Colors.White);
}