Динамические Темы в 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); 

С уважением

Флуссер

Другие вопросы по тегам