Я бы, вероятно, решил эту проблему с помощью «службы настроек», которая предоставляет свойства для различных настроек и запускает INPC, как при обычном связывании. Затем я бы изменил этот стиль на что-то вроде:
<Style x:Key="MyWindowStyle">
<Setter Property="FontFamily" Value="{Binding Path=FontFamily, Source={StaticResource SettingsService}, FallbackValue=Arial}"/>
<Setter Property="FontSize" Value="{Binding Path=FontSize, Source={StaticResource SettingsService}, FallbackValue=12}"/>
</Style>
Ваш «сервис настроек» определен как статический ресурс:
<services:SettingsService x:Key="SettingsService"/>
Затем в каждом окне убедитесь, что стиль установлен как DynamicResource:
<Window Style="{DynamicResource MyWindowStyle}" .... >
Часто существует много недоразумений относительно различий между статическими и динамическими ресурсами, но основное различие заключается в том, что Static - это однократная настройка, тогда как Dynamic обновит настройки при изменении ресурса.
Теперь, если вы установите эти свойства в «службе настроек», они запустят INPC, который обновит стиль, который будет выбран DynamicResource, и соответствующим образом изменит свойства окна.
Кажется, что это большая работа, но она дает вам хорошую гибкость, и вся «тяжелая работа» выполняется исключительно с помощью привязок. Мы используем похожую технику в проекте, над которым я сейчас работаю, поэтому, когда пользователь выбирает цвет заливки / обводки, различные инструменты в панели инструментов обновляются, чтобы отразить новые значения.