Замена объединенных словарей ресурсов при загрузке приложения Silverlight

StackOverflow https://stackoverflow.com/questions/1930368

Вопрос

У меня есть набор стилей и кистей, определенных в 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

В настоящее время я думаю, что что-то вроде этого — лучший способ справиться с динамическим переключением тем во время выполнения.Но для портирования существующего приложения для использования такого механизма требуется много работы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top