Ресурсы ? Загрузка темы (словарь ресурсов), но - PullRequest
1 голос
/ 02 августа 2011

Как я могу сделать -?

  • Загрузить большой ResourceDictionary с (или нет) MergedDictionaries, но добавить только те ключи, которые не найдены в ресурсах (Application.Current.Resources), и обновить найденные.

Я хочу сделать это, так как у меня есть много тем для моего wpf-приложения, но некоторые стили управления исправлены. Поэтому я сначала очищаю все ресурсы, затем загружаю новый (все очищается). Есть много фиксированных стилей управления, поэтому я не могу загрузить каждый из них.

1 Ответ

2 голосов
/ 02 августа 2011

Application.Resources - это ResourceDictionary.Загружаемый вами словарь также является ResourceDictionary.Вы можете добавить ресурсы в ResourceDictionary через Add.Вы можете перечислить ресурсы в ResourceDictionary, так как он реализует ICollection.Вы также можете запросить, существует ли ресурс, так как он реализует IDictionary.ResourceDictionary может содержать другие ResourceDictionaries в своей коллекции ResourceDictionaries: MergedDictionaries.

То, как вы хотите объединить их, зависит от нескольких вещей.Одна из тактик, которую я использовал, - это объединение на уровне ResourceDictionary, поэтому я удаляю ResourceDictionary из моего Application.Resources.MergedDictionaries, а затем добавляю загруженный ResourceDictionary, который я загрузил.Если вы хотите объединить, добавив отдельные ресурсы, которые существуют в вашем ResourceDictionary, но еще не существуют в Application.Resources, вы можете перечислить так:

void AddOrUpdate(DictionaryEntry resource)
{
    // If it exists, remove it; contains checks base and merged dictionaries
    if (Application.Current.Resources.Contains(resource.Key))
    {
        // Must try to remove from all; if it doesn't exist there is no effect
        Application.Current.Resources.Remove(resource.Key);
        foreach (ResourceDictionary nextDictionary in Application.Current.Resources.MergedDictionaries)
            nextDictionary.Remove(resource.Key);
    }

    // We can now add it
    Application.Current.Resources.Add(resource.Key, resource.Value);
}


void MergeMyDictionary(ResourceDictionary myResourceDictionary)
{
    foreach (DictionaryEntry nextResource in myResourceDictionary)
        AddOrUpdate(nextResource);
    foreach (ResourceDictionary nextDictionary in myResourceDictionary.MergedDictionaries)
    {
        foreach (DictionaryEntry nextResource in nextDictionary)
            AddOrUpdate(nextResource);
    }
}
...