2009-06-12 8 views
0

Ich habe eine Anwendung, die es dem Benutzer ermöglicht, Farbschemata basierend auf einer externen XAML-Datei zu ändern. Wenn der Benutzer auf einem MenuItem klickt, der den Namen eines Themas enthält, führt der folgende Code:Wie kann ich eine Änderung der Ressourcen vornehmen, um sie in der gesamten Anwendung zu implementieren, einschließlich in 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); 
    } 
} 

Dies funktioniert für die meisten der Anwendung - alle meine Ressourcen Bürsten ändern - mit einer Ausnahme. Ich habe eine Untersteuerung, deren Hintergrundfarbe durch eine Wertbindung mit einem Konverter bestimmt wird. Anstatt hart Code die Farben in den Konverter, obwohl, hatte ich die Converters String-Konstanten für Pinsel Namen und dann die Farbe aus App.Current.Resources zurück:

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

Was hier zu sein scheint passiert ist, dass Application.Current.Resources enthält nicht die gleichen Ressourcen wie das Fenster. Ich habe versucht, das Thema in Application.Current.Resources zu laden und davon im Konverter zu lesen, aber das scheint auch nicht zu funktionieren. Kann mir jemand sagen, was ich hier vermisse? Gibt es eine Möglichkeit, beispielsweise Application.Current.Resources zu ändern und die geöffneten Fenster zu beeinflussen?

Danke!

Antwort

0

Es ist schwer zu sagen, ohne Ihren gesamten Code zu sehen, aber die Überprüfung der Resources Eigenschaft überprüft nicht automatisch fusionierte Wörterbücher. Wenn Sie die Theme-Ressourcen auf der Ebene Window zusammenführen, sind sie auch nicht auf der Anwendungsebene. Aus Gründen der Einheitlichkeit willen, sind Sie am besten auf Ihren Konverter ein Halten des Elements erhalten, die sie für konvertiert und mit FindResource:

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

ein IMultiValueConverter verwenden, kann die beste Option sein. Alternativ, wenn das zu unordentlich wird, können Sie eine Markup-Erweiterung schreiben, die das tut, was Sie brauchen.

Verwandte Themen