using System.Collections.ObjectModel; using WPFluent.Extensions; namespace WPFluent.Appearance; /// /// Allows managing application dictionaries. /// internal class ResourceDictionaryManager(string searchNamespace) { private Collection GetApplicationMergedDictionaries() { return UiApplication.Current.Resources.MergedDictionaries; } /// /// Gets the if exists. /// /// Any part of the resource name. /// , if it doesn't exist. public ResourceDictionary? GetDictionary(string resourceLookup) { Collection applicationDictionaries = GetApplicationMergedDictionaries(); if (applicationDictionaries.Count == 0) { return null; } foreach (ResourceDictionary t in applicationDictionaries) { string resourceDictionaryUri; if (t?.Source != null) { resourceDictionaryUri = t.Source.ToString(); if (resourceDictionaryUri.Contains(SearchNamespace, StringComparison.OrdinalIgnoreCase) && resourceDictionaryUri.Contains(resourceLookup, StringComparison.OrdinalIgnoreCase)) { return t; } } foreach (ResourceDictionary? t1 in t!.MergedDictionaries) { if (t1?.Source == null) { continue; } resourceDictionaryUri = t1.Source.ToString(); if (!resourceDictionaryUri.Contains(SearchNamespace, StringComparison.OrdinalIgnoreCase) || !resourceDictionaryUri.Contains(resourceLookup, StringComparison.OrdinalIgnoreCase)) { continue; } return t1; } } return null; } /// /// Shows whether the application contains the . /// /// Any part of the resource name. /// if it doesn't exist. public bool HasDictionary(string resourceLookup) { return GetDictionary(resourceLookup) != null; } /// /// 显示应用程序是否包含 . /// /// 资源名称的任何部分。 /// A valid for the replaced resource. /// if the dictionary was updated. otherwise. public bool UpdateDictionary(string resourceLookup, Uri? newResourceUri) { Collection applicationDictionaries = UiApplication .Current .Resources .MergedDictionaries; if (applicationDictionaries.Count == 0 || newResourceUri is null) { return false; } for (var i = 0; i < applicationDictionaries.Count; i++) { string sourceUri; if (applicationDictionaries[i]?.Source != null) { sourceUri = applicationDictionaries[i].Source.ToString(); if (sourceUri.Contains(SearchNamespace, StringComparison.OrdinalIgnoreCase) && sourceUri.Contains(resourceLookup, StringComparison.OrdinalIgnoreCase)) { applicationDictionaries[i] = new() { Source = newResourceUri }; return true; } } for (var j = 0; j < applicationDictionaries[i].MergedDictionaries.Count; j++) { if (applicationDictionaries[i].MergedDictionaries[j]?.Source == null) { continue; } sourceUri = applicationDictionaries[i].MergedDictionaries[j].Source.ToString(); if (!sourceUri.Contains(SearchNamespace, StringComparison.OrdinalIgnoreCase) || !sourceUri.Contains(resourceLookup, StringComparison.OrdinalIgnoreCase)) { continue; } applicationDictionaries[i].MergedDictionaries[j] = new() { Source = newResourceUri }; return true; } } return false; } /// /// 获取命名空间,例如正在搜索的资源库。 /// public string SearchNamespace { get; } = searchNamespace; }