Question

J'ai un ensemble de styles et de brosses définies dans un ResourceDictionary que je suis le chargement en tant que MergedDictionary en XAML de mon contrôle de haut niveau:

<ResourceDictionary.MergedDictionaries>
     <ResourceDictionary Source="/MyAssembly;component/Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>

Je suis en train de en option remplacer certains de ces styles et pinceaux si un fichier XAML différent existe dans le XAP avec sa propre ResourceDictionary. Je suis en train de fusionner dans ce dictionnaire à l'exécution avant InitializeComponent () est appelée sur mon contrôle utilisateur. J'utilise le code suivant pour tenter de faire ceci:

public static class StyleLoader
{
    public static void MergeStyle(string xamlUri)
    {
        try
        {
            XDocument xaml = XDocument.Load(xamlUri);
            ResourceDictionary rd = XamlReader.Load(xaml.ToString()) as ResourceDictionary;
            Application.Current.Resources.MergedDictionaries.Add(rd);

        }
        catch (XmlException ex)
        {
            // if the file doesn't exist, we can't add it
        }
    }
}

Le dictionnaire de ressources à partir du fichier en option est chargé fin et a fusionné, mais mon jeu de styles d'origine semble toujours être redéfinissant cette. Si je commente le dictionnaire fusionné en XAML et de les charger simplement à l'exécution afin qu'il fonctionne parfaitement:

    StyleLoader.MergeStyle("/MyAssembly;component/Styles.xaml");
    StyleLoader.MergeStyle("BrushReplacements.xaml");

    InitializeComponent();

Mon problème avec cette solution est que sans les styles par défaut dans XAML, je ne peux pas ouvrir le projet dans le mélange. Quelqu'un at-il des idées pour une solution qui gardera mes styles par défaut connus Blend mais permettez-moi pour éventuellement les remplacer lors de l'exécution avec un dictionnaire de ressources dynamiquement chargé? Merci!

Était-ce utile?

La solution

Voici une solution où les couleurs / brosses sont appliquées avec des liaisons au lieu de se référer directement aux ressources statiques:
http://blogs.msdn.com/corrinab/archive/ 2009/11/24 / 9927729.aspx
Deuxième partie:
http://blogs.msdn.com/corrinab/archive/ 2009/12/02 / 9931283.aspx

À l'heure actuelle, je pense que quelque chose comme cela est la meilleure façon de traiter les thèmes de commutation dynamiquement lors de l'exécution. Mais il nécessite beaucoup de travail au port d'une application existante d'utiliser un mécanisme comme celui-ci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top