Существует один известный мне подход: ResourceDictionary
, очень простой и полезный во многих случаях, например, для многоязычного использования вашего приложения или добавления тем.
Прежде всего, для каждой темы, которую вы хотите добавить, вы должны добавить ResourceDictionary в ваш проект и определить стили, шрифты или кисти или любые ресурсы, которые вы хотите использовать в качестве темы, в этом конкретном ResourceDictionary.
Пример (MyFirstTheme.xaml):
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<FontFamily x:Key="MyFont">Segoe UI</FontFamily>
<SolidColorBrush x:Key="MyThemeColor" Color="#FF34495E"/>
</ResourceDictionary>
Пример (MySecondTheme.xaml):
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<FontFamily x:Key="MyFont">Tahoma</FontFamily>
<SolidColorBrush x:Key="MyThemeColor" Color="#D89A9E"/>
</ResourceDictionary>
Вы должны добавить словари ресурсов как можно больше тем. И для того, чтобы установить один по умолчанию, вы должны указать его в файле App.xaml
следующим образом:
<Application x:Class="MyApp.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Themes\MyFirstTheme.xaml"/>
// This will be the default theme
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
Для назначения темы на объекты или элементы управления, вы должны сделать следующее:
<Window x:Name="window" x:Class="MyApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
Title="MyApp" Height="400" Width="400" FontFamily="{DynamicResource MyFont}">
<Grid>
<TextBlock Foreground="{DynamicResource MyThemeColor}" Text="Theme Test" />
</Grid>
</Window>
Примечание. При использовании ресурсов в элементах управления или объектах привязка должна быть определена как
DynamicResource
Предположим, что вы добавили все словари тем и хотите переключаться между ними в коде, используйте эту функцию:
public void ChangeTheme(string ThemeName)
{
ResourceDictionary dict = new ResourceDictionary();
dict.Source = new Uri("..\\Themes\\" + ThemeName + ".xaml", UriKind.Relative);
App.Current.Resources.MergedDictionaries.Add(dict);
}
Использование:
ChangeTheme("MySecondTheme");
UpdateLayout();