3

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:Remplacement Fusionné Dictionnaires de ressources sur la charge de Silverlight application

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

Je suis en train à éventuellement remplacer certains de ces styles & brosses si un fichier XAML différent existe dans le XAP avec son propre ResourceDictionary. J'essaye de fusionner dans ce dictionnaire à l'exécution avant qu'InitializeComponent() soit appelé sur mon contrôle d'utilisateur. J'utilise le code suivant pour tenter de le faire:

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 facultatif est bien chargé et fusionné, mais mon jeu original de styles 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 Blend . Quelqu'un a-t-il des idées pour une solution qui gardera mes styles par défaut connus de Blend mais qui me permettra de les surcharger à l'exécution avec un dictionnaire de ressources chargé dynamiquement? Merci!

Répondre

1

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

Actuellement, je pense que quelque chose comme ceci est la meilleure façon de traiter avec des thèmes de changement dynamique à l'exécution. Mais il faut beaucoup de travail pour porter une application existante pour utiliser un mécanisme comme celui-ci.

+1

Ce n'est pas vraiment la façon dont je voulais le faire (cela semble vraiment devoir être résolu avec des ressources au lieu de pinceaux de liaison) ... mais cela semble être la meilleure approche de contournement des styles dynamiques que j'ai vus donc je vais le marquer comme répondu. –

Questions connexes