2009-06-12 6 views
0

私は、ユーザーが外部のxamlファイルに基づいてカラースキームを変更できるアプリケーションを持っています。テーマの名前が含まれていたMenuItemをユーザーがクリックすると、次のコードを実行すると: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); 
    } 
} 

これは、アプリケーションのほとんどのために働く - 私のリソースのブラシのすべての変更 - 一つの例外を除いて。背景色はコンバーターを使用して値バインディングによって決定されるサブコントロールを持っています。むしろハードコードよりコンバータへの色は、しかし、私はブラシ名のコンバータを使用する文字列定数を持っていたし、その後App.Current.Resourcesから色を返す:

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

何ここで起こっているようだがということですApplication.Current.Resourcesは、ウィンドウと同じリソースセットを保持していません。私は、Application.Current.Resourcesにテーマを読み込み、それをコンバーターで読み込もうとしましたが、どちらもうまくいかないようです。誰かが私がここで逃しているものを教えてくれる? Application.Current.Resourcesを変更して開いたウィンドウに影響を与える方法がありますか?

ありがとうございます!

答えて

0

それはすべてあなたのコードを見ずに言うのは難しいですが、Resourcesプロパティをチェックすると、自動的にマージされた辞書をチェックしません。また、テーマリソースをWindowレベルにマージしている場合、それらはアプリケーションレベルにはまったくありません。一貫性のために、あなたはあなたのコンバータは、それがために変換しFindResourceを使用している要素のホールドを取得した最高のオフだ:

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

IMultiValueConverterを使用すると、あなたの最良の選択肢かもしれません。また、それが面倒すぎる場合は、必要なことをするマークアップ拡張を書くことに目を向けるかもしれません。