WPF modifier Dynamiquement fichier de ressources et de thème

Mon projet utilise un ProjectTheme.fichier xaml pour tous WPF, windows par le biais de son projet.
Le ProjectTheme.fichier xaml fait référence à un thème de style comme suit

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <!-- In order to modify the project's theme, change this line -->
        <ResourceDictionary Source="/MyProject;component/Themes/WPFThemes/Customized.xaml" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

Tous WPF, Windows références WindowBase.xaml

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/MyProject;component/View/WindowBase.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

WindowBase.xaml références personnalisées barre de titre Bar1.xaml

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/MyProject;component/Themes/WPFThemes/Bar1.xaml" />
</ResourceDictionary.MergedDictionaries>

Bar1.xaml références ProjectTheme.xaml

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/MyProject;component/ProjectTheme.xaml"/>
</ResourceDictionary.MergedDictionaries>

De sorte que le heriarchy est

  • Window1 références WindowBase.xaml
  • WindowBase références Bar1.xaml
  • Bar1 références ProjectTheme.xaml
  • ProjectTheme.xaml de référence le véritable thème de fichier de ressources.

Cela fonctionne bien.
Maintenant, j'ai envie de changer dynamiquement le thème du projet au moment de l'exécution, sans quitter l'application.
En supposant que j'ai plusieurs thème des fichiers de style

  • Personnalisés.xaml
  • Customized1.xaml
  • Customized2.xaml

Ma question est
s'il est possible de mettre à jour dynamiquement les ProjectTheme.fichier xaml au moment de l'exécution de changer la ligne
de

<ResourceDictionary Source="/MyProject;component/Themes/WPFThemes/Customized.xaml" />

à

<ResourceDictionary Source="/MyProject;component/Themes/WPFThemes/Customized1.xaml" />

pour atteindre mon objectif?
Si oui, comment dois-je faire?
Si non, quelle est la raison et quel est le meilleur (d'autres) de manière à atteindre mon but?

J'ai essayé ce qui suit, mais aucune de ces travaux: le style ne change pas.

voie 1

Application.Current.Resources.MergedDictionaries.Clear();
Uri NewTheme = new Uri(@"/MyProject;component/Themes/WPFThemes/Customized2.xaml", UriKind.Relative);
ResourceDictionary dictionary = (ResourceDictionary)Application.LoadComponent(NewTheme);
Application.Current.Resources.MergedDictionaries.Add(dictionary);

2

Application.Current.Resources.MergedDictionaries.RemoveAt(0);
Uri NewTheme = new Uri(@"/MyProject;component/Themes/WPFThemes/Customized2.xaml", UriKind.Relative);
ResourceDictionary dictionary = (ResourceDictionary)Application.LoadComponent(NewTheme);
Application.Current.Resources.MergedDictionaries.Insert(0, dictionary);

Note:
Dans ma vraie thème des fichiers de style (sur mesure.xaml...), j'ai utilisé une combinaison de ressource dynamique et statique de la ressource. N'a que des questions?

Merci d'avance.

OriginalL'auteur Shawn | 2013-07-29