我该怎么办?
ResourceDictionary
加载大MergedDictionaries
,但只添加资源(Application.Current.Resources)中找不到的密钥并更新找到的密钥。我想这样做,因为我的wpf应用程序有很多主题,但是一些控件样式是固定的。所以我首先清除所有资源,然后加载新资源(一切都清理完毕)。有许多固定的样式控件,所以我无法加载每个。
答案 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);
}
}