Динамические Темы в WPF
Я собираюсь разработать приложение для Windows в.net с использованием WPF. Итак, как мы можем реализовать динамические темы во время выполнения. Я много об этом искал, но не могу этого понять. Если я добавлю строку ниже в app.xaml, то это покажет ошибку, потому что, как мы можем добавить строку вещи напрямую. Хотя файла с именем "ExpressionDark" не существует.
<ResourceDictionary Source="Themes/ExpressionDark.xaml"/>
***or***
<ResourceDictionary Source="ExpressionDark.xaml"/>
Заранее спасибо:)
2 ответа
Предполагая, что DynamicThemes
Вы хотите поместить темы во время выполнения, наилучшим из возможных способов загрузки словаря ресурсов, полного стилей элементов управления, в ресурс основного приложения или любого элемента управления.
public static ResourceDictionary GetThemeResourceDictionary(Uri theme)
{
if (theme != null)
{
return Application.LoadComponent(theme) as ResourceDictionary;
}
return null;
}
public static void ApplyTheme(this ContentControl control /* Change this to Application to use this function at app level */, string theme)
{
ResourceDictionary dictionary = GetThemeResourceDictionary(theme);
if (dictionary != null)
{
// Be careful here, you'll need to implement some logic to prevent errors.
control.Resources.MergedDictionaries.Clear();
control.Resources.MergedDictionaries.Add(dictionary);
// For app level
// app.Resources.MergedDictionaries.Clear();
// app.Resources.MergedDictionaries.Add(dictionary);
}
}
Вы можете объединить тему в App.Xaml следующим образом:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="defaulttheme.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Файл defaulttheme.xaml должен находиться в корне вашего проекта. Если вы хотите создать свой собственный проект для этой темы, вы можете объединить ресурсы следующим образом:
<ResourceDictionary Source="/MyThemeProject;component/defaulttheme.xaml" />
здесь defaulthteme.xaml также должен быть в корне MyThemeProject и не забудьте добавить ссылку на этот проект из вашего основного проекта.
Для построения структуры вы можете добавлять папки по своему усмотрению.
<ResourceDictionary Source="/MyThemeProject;component/Folder1/Folder2/defaulttheme.xaml" />
Для переключения тем сначала очистите MergedDictionaries, а затем добавьте новую тему
NewTheme = new Uri(@"/MyThemeProject;component/folder1/Folder2/bluetheme.xaml", UriKind.Relative);
Application.Current.Resources.MergedDictionaries.Clear();
Application.Current.Resources.MergedDictionaries.Add(NewTheme);
С уважением
Флуссер