资源?加载主题(资源字典)但是

时间:2011-08-02 15:51:59

标签: wpf resources dictionary themes

我该怎么办?

  • 使用(或不)ResourceDictionary加载大MergedDictionaries,但只添加资源(Application.Current.Resources)中找不到的密钥并更新找到的密钥。

我想这样做,因为我的wpf应用程序有很多主题,但是一些控件样式是固定的。所以我首先清除所有资源,然后加载新资源(一切都清理完毕)。有许多固定的样式控件,所以我无法加载每个。

1 个答案:

答案 0 :(得分:2)

Application.Resources是一个ResourceDictionary。您加载的字典也是ResourceDictionary。您可以通过Add向ResourceDictionary添加资源。您可以枚举ResourceDictionary中的资源,因为它实现了ICollection。您还可以查询资源是否存在,因为它实现了IDictionary。 ResourceDictionary可以在其ResourceDictionaries集合中包含其他ResourceDictionaries:MergedDictionaries。

如何合并这些取决于一些事情。我使用的一种策略是在ResourceDictionary级别进行合并,因此我从Application.Resources.MergedDictionaries中删除了ResourceDictionary,然后添加了我加载的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);
    }
}