Замена объединенных словарей ресурсов при загрузке приложения Silverlight
-
20-09-2019 - |
Вопрос
У меня есть набор стилей и кистей, определенных в ResourceDictionary, который я загружаю как MergedDictionary в XAML моего элемента управления верхнего уровня:
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MyAssembly;component/Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>
я пытаюсь необязательно замените некоторые из этих стилей и кистей, если в XAP существует другой файл XAML, на собственный ResourceDictionary.Я пытаюсь объединить этот словарь во время выполнения до вызова 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, но позволит мне при необходимости переопределить их во время выполнения с помощью динамически загружаемого словаря ресурсов?Спасибо!
Решение
Вот решение, в котором цвета/кисти применяются с привязками вместо прямой ссылки на статические ресурсы:
http://blogs.msdn.com/corrinab/archive/2009/11/24/9927729.aspx
Часть вторая:
http://blogs.msdn.com/corrinab/archive/2009/12/02/9931283.aspx
В настоящее время я думаю, что что-то вроде этого — лучший способ справиться с динамическим переключением тем во время выполнения.Но для портирования существующего приложения для использования такого механизма требуется много работы.