Files
ShrlAlgoToolkit/NeuWPF/NeoUI/Appearance/ResourceDictionaryManager.cs

133 lines
4.7 KiB
C#
Raw Normal View History

2025-07-31 20:12:24 +08:00
using System.Collections.ObjectModel;
using System.Reflection;
2025-08-20 12:10:35 +08:00
using NeoUI.Extensions;
2025-07-31 20:12:24 +08:00
2025-08-20 12:10:35 +08:00
namespace NeoUI.Appearance;
2025-07-31 20:12:24 +08:00
/// <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)
{
2025-08-20 12:10:35 +08:00
Collection<ResourceDictionary>? applicationDictionaries = ThemeManager.Current?.Resources.MergedDictionaries;
2025-07-31 20:12:24 +08:00
2025-08-20 12:10:35 +08:00
if (applicationDictionaries is { Count: 0 })
2025-07-31 20:12:24 +08:00
{
return null;
}
2025-08-20 12:10:35 +08:00
if (applicationDictionaries == null) return null;
2025-08-12 23:08:54 +08:00
foreach (var t in applicationDictionaries)
2025-07-31 20:12:24 +08:00
{
string resourceDictionaryUri;
if (t?.Source != null)
{
resourceDictionaryUri = t.Source.ToString();
2025-08-20 12:10:35 +08:00
if (resourceDictionaryUri.Contains(SearchNamespace, StringComparison.OrdinalIgnoreCase) &&
2025-07-31 20:12:24 +08:00
resourceDictionaryUri.Contains(resourceLookup, StringComparison.OrdinalIgnoreCase))
{
return t;
}
}
2025-08-12 23:08:54 +08:00
foreach (var t1 in t!.MergedDictionaries)
2025-07-31 20:12:24 +08:00
{
if (t1?.Source == null)
{
continue;
}
resourceDictionaryUri = t1.Source.ToString();
2025-08-20 12:10:35 +08:00
if (resourceDictionaryUri.Contains(SearchNamespace, StringComparison.OrdinalIgnoreCase) &&
2025-07-31 20:12:24 +08:00
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
2025-08-20 12:10:35 +08:00
.Current?.Resources
2025-07-31 20:12:24 +08:00
.MergedDictionaries;
// 如果没有资源字典或新的Uri为空则返回false
2025-08-20 12:10:35 +08:00
if (applicationDictionaries is { Count: 0 } || newResourceUri is null)
2025-07-31 20:12:24 +08:00
{
return false;
}
// 遍历顶层资源字典
2025-08-20 12:10:35 +08:00
if (applicationDictionaries == null) return false;
2025-07-31 20:12:24 +08:00
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;
}
}
}
2025-08-20 12:10:35 +08:00
2025-07-31 20:12:24 +08:00
// 未找到匹配的资源字典返回false
return false;
}
}