web-dev-qa-db-ja.com

WPFで1つのResourceDictionaryを別のResourceDictionaryにインポートする方法は?

1つのリソースディクショナリを別のリソースディクショナリに追加することは可能ですか?助けてくれてありがとう。

22
snstuff

Dictionary2.xamlで、MergedDictionariesを定義します(ResourceDictionaryタグを開いた直後)。

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/Path/to/Dictionary1.xaml" />
</ResourceDictionary.MergedDictionaries>

落とし穴があります。辞書をマージするたびに、マージされた辞書のコピーを効果的に作成します。そしてそれは再帰的です-両方ともDictionary2.xamlをロードするDict3.xamlとDict4.xamlがある場合、Dictionary1.xamlの3つのインスタンスが作成されます

解決策は SharedResourceDictionary です。チュートリアルの実装は出発点と見なす必要があり、使用シナリオに応じて、おそらくある程度の調整が必要になります。いくつかの落とし穴と解決策については、Googleの「wpfSharedResourceDictionary」。

答えから この質問 by XAMeLi

23
Tilak

私が取り組んでいるsketchflowプロジェクトからのスニペットで、xamlのリソース辞書をマージする方法を示しています。

<Application.Resources>
    <!-- Resources scoped at the Application level should be defined here. -->
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Microsoft.Expression.Prototyping.SketchControls;component/ScrollViewerStyles.xaml"/>
            <ResourceDictionary Source="/[ProjectABC];component/[fileXYZ].xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

これは、2つの追加のリソースディクショナリを別のリソースディクショナリにマージすることを示しています。

(デフォルトのスタイルが複数の場所で定義されている場合、それらは互いに上書きされるため、順序が重要になる可能性があることに注意してください)

4
Scott

何かのようなもの:

ResourceDictionary resources = new ResourceDictionary();
resources.Source = new Uri("/MyModule;component/MyModule.xaml", 
     UriKind.RelativeOrAbsolute);
Application.Current.Resources.MergedDictionaries.Add(resources);

あなたが探しているものかもしれません。 Prismモジュールではこのようなコードを使用します。

1
GWLlosa

より多くの文脈がなければ、あなたに特定の答えを与えることは困難です。リソースディクショナリのマージに関連する可能性のあるリソースは次のとおりです。

http://msdn.Microsoft.com/en-us/library/aa350178.aspx

0
Kal_Torak