gpt4 book ai didi

wpf - 根据URI检测WPF资源是否存在

转载 作者:行者123 更新时间:2023-12-03 23:50:14 60 4
gpt4 key购买 nike

给定一个 pack://URI,判断该 URI 是否确实存在已编译资源(例如,使用“资源”的构建操作编译的 PNG 图像)的最佳方法是什么?

经过一些磕磕绊绊,我想出了这个代码,它有效但很笨拙:

private static bool CanLoadResource(Uri uri)
{
try
{
Application.GetResourceStream(uri);
return true;
}
catch (IOException)
{
return false;
}
}

(请注意 Application.GetResources 文档 is wrong -- 如果找不到资源,它会抛出异常,而不是像文档错误状态那样返回 null。)(文档已更正,请参阅下面的评论)

我不喜欢捕捉异常来检测预期的(非异常)结果。此外,我实际上并不想加载流,我只想知道它是否存在。

有没有更好的方法来做到这一点,也许使用较低级别的资源 API——理想情况下不实际加载流并且不捕获异常?

最佳答案

我找到了一个我正在使用的解决方案,它不能直接与包 Uri 一起使用,而是通过它的资源路径查找资源。话虽如此,这个示例可以很容易地修改以支持包 URI,而不是只需将资源路径添加到 uri 的末尾,该 uri 使用程序集来制定 URI 的基本部分。

public static bool ResourceExists(string resourcePath)
{
var assembly = Assembly.GetExecutingAssembly();

return ResourceExists(assembly, resourcePath);
}

public static bool ResourceExists(Assembly assembly, string resourcePath)
{
return GetResourcePaths(assembly)
.Contains(resourcePath.ToLowerInvariant());
}

public static IEnumerable<object> GetResourcePaths(Assembly assembly)
{
var culture = System.Threading.Thread.CurrentThread.CurrentCulture;
var resourceName = assembly.GetName().Name + ".g";
var resourceManager = new ResourceManager(resourceName, assembly);

try
{
var resourceSet = resourceManager.GetResourceSet(culture, true, true);

foreach(System.Collections.DictionaryEntry resource in resourceSet)
{
yield return resource.Key;
}
}
finally
{
resourceManager.ReleaseAllResources();
}
}

关于wpf - 根据URI检测WPF资源是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2013481/

60 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com