3

トップレベル コントロールの XAML で MergedDictionary として読み込んでいる ResourceDictionary で定義されたスタイルとブラシのセットがあります。

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

XAP に独自の ResourceDictionary を持つ別の XAML ファイルが存在する場合、これらのスタイルとブラシの一部をオプションで置き換えようとしています。ユーザー コントロールで 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 でプロジェクトを開くことができないことです。デフォルトのスタイルを Blend に認識させたまま、動的に読み込まれたリソース ディクショナリを使用して実行時にオプションでオーバーライドできるようにするソリューションのアイデアはありますか? ありがとう!

4

1 に答える 1

1

静的リソースを直接参照するのではなく、バインディングを使用して色/ブラシを適用するソリューションを次に示します :
http://blogs.msdn.com/corrinab/archive/2009/11/24/9927729.aspx /blogs.msdn.com/corrinab/archive/2009/12/02/9931283.aspx

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

于 2010-01-21T11:46:42.807 に答える