2009-06-12 3 views
0

J'ai une application qui permet à l'utilisateur de changer les schémas de couleurs basés sur un fichier xaml externe. Lorsque l'utilisateur clique sur un MenuItem qui contient le nom d'un thème, le code suivant exécute:Comment puis-je obtenir une modification des ressources à propager dans toute l'application, y compris dans ValueConverters?

MenuItem mi = sender as MenuItem; 
string executingDirectory = Assembly.GetExecutingAssembly().Location.Substring(0, Assembly.GetExecutingAssembly().Location.LastIndexOf("\\")); 
string path = System.IO.Path.Combine(executingDirectory + "\\Themes", mi.Header.ToString() + ".xaml"); 

if (File.Exists(path)) 
{ 
    using (FileStream fs = new FileStream(path, FileMode.Open)) 
    { 
     ResourceDictionary dic = (ResourceDictionary)XamlReader.Load(fs); 
     Resources.MergedDictionaries.Clear(); 
     Resources.MergedDictionaries.Add(dic); 
    } 
} 

Cela fonctionne pour la plupart de l'application - tous mes pinceaux de ressources sur le changement - à une exception près. J'ai un sous-contrôle dont la couleur de fond est déterminée par une liaison de valeur à l'aide d'un convertisseur. Plutôt que de coder en dur les couleurs dans le convertisseur, cependant, j'ai eu les constantes de chaîne d'utilisation du convertisseur pour les noms de brosse, puis retourner la couleur de App.Current.Resources:

Brush ret = Application.Current.Resources[brushToReturn] as Brush; 

Ce qui semble se passer ici est que Application.Current.Resources ne contient pas le même ensemble de ressources que la fenêtre. J'ai essayé de charger le thème dans Application.Current.Resources et de le lire dans le convertisseur, mais cela ne semble pas fonctionner non plus. Quelqu'un peut-il me dire ce que je manque ici? Existe-t-il un moyen de modifier, par exemple, Application.Current.Resources et de l'affecter aux fenêtres ouvertes?

Merci!

Répondre

0

Il est difficile de dire sans voir tout votre code, mais la vérification de la propriété Resources ne vérifie pas automatiquement les dictionnaires fusionnés. En outre, si vous fusionnez les ressources de thème au niveau Window, elles ne seront pas du tout au niveau de l'application. Par souci de cohérence, vous êtes mieux d'avoir votre convertisseur obtenir une prise de l'élément auquel il est convertissait et en utilisant FindResource:

var frameworkElement = values[0] as FrameworkElement; 
var resource = frameworkElement.FindResource("SomeKey") as Brush; 

L'utilisation d'un IMultiValueConverter pourrait être votre meilleure option. Alternativement, si cela devient trop compliqué, vous pourriez envisager d'écrire une extension de balisage qui fait ce dont vous avez besoin.

Questions connexes