Files
ShrlAlgoToolkit/NeuWPF/NeoUI/Appearance/ResourceDictionaryManager.cs
2025-08-20 12:10:13 +08:00

131 lines
4.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Collections.ObjectModel;
using System.Reflection;
using NeumUI.Extensions;
namespace NeumUI.Appearance;
/// <summary>
/// 管理资源字典
/// </summary>
internal class ResourceDictionaryManager
{
/// <summary>
/// 获取命名空间,例如正在搜索的资源库。
/// </summary>
private string SearchNamespace { get; } = Assembly.GetExecutingAssembly().GetName().Name;
/// <summary>
/// 查找资源 <see cref="ResourceDictionary"/>
/// </summary>
/// <param name="resourceLookup">任何部分的资源名称。</param>
/// <returns><see cref="ResourceDictionary"/>, <see langword="null"/>如果不存在返回null</returns>
public ResourceDictionary? LookupDictionary(string resourceLookup)
{
Collection<ResourceDictionary> applicationDictionaries = ThemeManager.Current.Resources.MergedDictionaries;
if (applicationDictionaries.Count == 0)
{
return null;
}
foreach (var 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 (var t1 in t!.MergedDictionaries)
{
if (t1?.Source == null)
{
continue;
}
resourceDictionaryUri = t1.Source.ToString();
if (resourceDictionaryUri.Contains(SearchNamespace, StringComparison.OrdinalIgnoreCase)&&
resourceDictionaryUri.Contains(resourceLookup, StringComparison.OrdinalIgnoreCase))
{
return t1;
}
}
}
return null;
}
/// <summary>
/// 更新应用程序中的资源字典
/// </summary>
/// <param name="resourceLookup">要查找的资源名称的一部分</param>
/// <param name="newResourceUri">用于替换的新资源的有效Uri</param>
/// <returns>如果字典Uri已更新则返回true否则返回false</returns>
public bool UpdateDictionary(string resourceLookup, Uri? newResourceUri)
{
// 获取应用程序的合并资源字典集合
var applicationDictionaries = ThemeManager
.Current
.Resources
.MergedDictionaries;
// 如果没有资源字典或新的Uri为空则返回false
if (applicationDictionaries.Count == 0 || newResourceUri is null)
{
return false;
}
// 遍历顶层资源字典
for (var i = 0; i < applicationDictionaries.Count; i++)
{
string sourceUri;
// 检查当前资源字典是否有Source
if (applicationDictionaries[i]?.Source != null)
{
sourceUri = applicationDictionaries[i].Source.ToString();
// 检查资源Uri是否匹配搜索条件
if (sourceUri.Contains(SearchNamespace, StringComparison.OrdinalIgnoreCase) &&
sourceUri.Contains(resourceLookup, StringComparison.OrdinalIgnoreCase))
{
// 使用新的Uri更新资源字典
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();
// 检查子资源字典Uri是否匹配搜索条件
if (sourceUri.Contains(SearchNamespace, StringComparison.OrdinalIgnoreCase) &&
sourceUri.Contains(resourceLookup, StringComparison.OrdinalIgnoreCase))
{
// 使用新的Uri更新子资源字典
applicationDictionaries[i].MergedDictionaries[j] = new ResourceDictionary { Source = newResourceUri };
return true;
}
}
}
// 未找到匹配的资源字典返回false
return false;
}
}