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;
}