トップレベル コントロールの 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 に認識させたまま、動的に読み込まれたリソース ディクショナリを使用して実行時にオプションでオーバーライドできるようにするソリューションのアイデアはありますか? ありがとう!