Это зависит от того, хотите ли вы иметь возможность менять темы (потому что по сути это то, что вы хотите делать) на лету (я полагаю, вы это делаете).
Я сам этого не делал, но думаю, что так должно быть:
- Используйте
ContentTemplate
или DataTemplate
для каждого элемента пользовательского интерфейса, который вы хотите сделать
- Обратитесь к этим шаблонам, используя
{DynamicResource}
- Получить ресурсы из ресурсов вашего приложения; вы разместите их там как
ResourceDictionary
объектов, по одному на каждую "тему", используя ResourceDictionary.MergedDictionaries
- Всякий раз, когда вы хотите изменить «тему», программно удалите все текущие объединенные словари и добавьте тот, который соответствует нужной «теме»
Для иллюстрации ваш Application
будет использовать словарь по умолчанию, например:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="themes\default.theme.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
И вы бы добавили / удалили словари с чем-то вроде
ResourceDictionary theme = (ResourceDictionary)Application.LoadComponent(themeUri);
Resources.MergedDictionaries.Add(theme);
Обновление: Я немного искал и нашел более полный пример того, что я описываю: Можно ли использовать темы WPF для включения нескольких обложек для приложения, которое можно изменить во время выполнения?