2011-01-09 5 views
1

更新メインアプリケーションのテーマをXAMLで明示的に設定せずにダイアログボックスに設定するにはどうすればよいですか?

私は間違いを犯したと恥ずかしいです。エラーは、私のテーマが私がテストに使用していた要素をスタイルしていないということでした。もちろん、私は適用されたスタイルを見ていませんでした。

しかし、この質問に対する回答は、あるUserControlから別のUserControlにリソースを明示的に設定する方法を示しています...興味深いです。

以下に説明する方法でアプリケーションにリソースを設定すると、実際には結果として得られるアプリケーションのすべてのユーザーコントロールテーマが暗黙的に設定されます。


メインアプリケーションクラスでResourceDictionaryとして設定されているテーマを使用しています。私のメインウィンドウは、このテーマを暗黙的に使用して自分自身をスタイルすると思います。私はしかし、ダイアログを表示すると

<Application> 
    <Application.Resources> 
     <ResourceDictionary Source="Themes/ExpressionDark.xaml" /> 

以下のコメントが間違っている、とすべてが暗黙のうちに

をスタイル設定され、これはスタイルされていません。

DialogBox dialog = new DialogBox(); 
dialog.ShowDialog(); 

DialogBoxのXAMLで明示的にスタイルを指定せずにこれを暗黙的に行う方法はありますか?

編集

私は、次の方法でリソースを設定しようとしました。彼らは働かなかった。

Window main = App.Current.Windows[0]; 
dialog.Resources = main.Resources; 
dialog.Owner = main; 

また、元のリソースが定義されているメインApp ...から設定してみました。

dialog.Resources = App.Current.Resources; 

答えて

1

あなたにも対話固有のリソースを指定する必要がない場合は、メインウィンドウのリソースにリソース一つの方法または別の、あるいは単に設定ダイアログのリソースを転送することができます:

public Dialogue(Window owner) 
    { 
     this.InitializeComponent(); 
     Owner = owner; 
     Resources = Owner.Resources; 
    } 

を(それは対話だので、私は同様にOwnerプロパティを設定する)

+0

OKが、それが見えます。あなたの応答をありがとう、これも同様に動作します。 – Nicholas

+0

そうですね、ちょっと試しましたが、あなたは正しいです、すべてのウィンドウで動作します。 –

3

あなたは次のようにのように実装できます。

dialog.Resources.MergedDictionaries.Add(this.Resources.MergedDictionaries[0]); 

そして、他の可能性が(私は好むないでしょう)アプリからそれらをロードすることです:私はミスを犯し、私のダイアログが暗黙のうちにいますが、デフォルト設定されているよう

ResourceDictionary dict = Application.LoadComponent(new Uri("<library>;component/Themes/<theme>.xaml", UriKind.Relative)) as ResourceDictionary; 

dialog.Resources.MergedDictionaries.Add(dict); 
+0

あなたのコメントをありがとうが、私は間違いをしたようです。 – Nicholas

関連する問題