質問

私はトップレベルコントロールのXAMLでMergedDictionaryとしてロードしていますのResourceDictionaryで定義されたスタイルとブラシのセットがあります:

<ResourceDictionary.MergedDictionaries>
     <ResourceDictionary Source="/MyAssembly;component/Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>

私は別のXAMLファイルは、独自のResourceDictionaryとXAPに存在する場合、これらのスタイル&ブラシの一部を置き換え、の必要に応じてのにしようとしています。私はのInitializeComponent()は、私のユーザーコントロール上で呼び出される前に、実行時にこの辞書にマージしようとしています。私はこれを行うにしようとするには、次のコードを使用しています:

public static class StyleLoader
{
    public static void MergeStyle(string xamlUri)
    {
        try
        {
            XDocument xaml = XDocument.Load(xamlUri);
            ResourceDictionary rd = XamlReader.Load(xaml.ToString()) as ResourceDictionary;
            Application.Current.Resources.MergedDictionaries.Add(rd);

        }
        catch (XmlException ex)
        {
            // if the file doesn't exist, we can't add it
        }
    }
}

オプションのファイルからリソースディクショナリは罰金ロードとマージされ、しかしスタイルの私の元のセットは、常にこれをオーバーライドしているようです。私は、XAMLでマージされた辞書をコメントアウトし、単に順番に実行時にそれらをロードした場合、それは完璧に動作します:

    StyleLoader.MergeStyle("/MyAssembly;component/Styles.xaml");
    StyleLoader.MergeStyle("BrushReplacements.xaml");

    InitializeComponent();

このソリューションで私の問題は、XAMLで既定のスタイルなしで、私はBlendでプロジェクトを開くことができないということです。誰もがブレンドすることが知られている私のデフォルトのスタイルを維持しますが、私は動的にロードされたリソースディクショナリを使用して実行時にそれらを上書きオプションでできるようになります解決のための任意のアイデアがありますか?ありがとう!

役に立ちましたか?

解決

ここで色/ブラシの代わりに静的リソースを直接参照のバインディングが印加された溶液である:
http://blogs.msdn.com/corrinab/archive/ 11分の2009/24 W / 9927729.aspx
パート2:
http://blogs.msdn.com/corrinab/archive/ 12分の2009/02 / 9931283.aspxする

現在、私はこのようなものは、実行時に動的に切り替えるテーマに対処する最善の方法だと思います。しかし、それは、このようなメカニズムを使用する既存のアプリケーションポートに多くの作業が必要です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top