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

У меня есть набор стилей и кистей, определенных в 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, но позволит мне при желании переопределить их во время выполнения с помощью динамически загружаемого словаря ресурсов? Спасибо!

1 Ответ

1 голос
/ 21 января 2010

Вот решение, в котором цвета / кисти применяются с привязками вместо прямой ссылки на статические ресурсы:
http://blogs.msdn.com/corrinab/archive/2009/11/24/9927729.aspx
Часть вторая:
http://blogs.msdn.com/corrinab/archive/2009/12/02/9931283.aspx

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

...