如何从资源中获取BitmapImage?

38
我的汇编包含一个BuildAction==Resource的图像。我想从这个嵌入式资源获取一个BitmapImage。

我可以像这样从文件加载一个BitmapImage:

var bitmap = new BitmapImage(new Uri(path));
但是我该如何创建一个指向嵌入资源图像的Uri呢?当我尝试创建打包URI(例如pack://application:,,,/MyImage.pngpack://application:,,,/MyAssembly;component/MyImage.png)时,会抛出异常:System.UriFormatException "无效的 URI:因为存在冒号(“:”),所以预期端口,但无法解析该端口。"在这篇博客文章中找到了解决UriFormatException的方法。然而,在应用此修复程序后,仍然会发生异常,尝试从pack URI加载BitmapImage时也会出现异常。当使用pack://application:,,,/Image.png格式时,会出现NullReferenceException,当使用pack://application:,,,/AssemblyName;component/Image.png格式时,会出现NotSupportedException "未识别 Uri 前缀"。


摘要我的问题是我试图在任何WPF控件/窗口等实例化之前使用'pack URI',因此'pack' URI方案尚未注册(其他WPF所需的"东西"也不能设置,因为手动注册pack方案本身并不能解决问题)。解决方案是等到实例化我的WPF用户控件后再使用pack URIs。


1
感谢您对问题的总结。我也遇到了同样的问题,会尝试像您建议的那样解决它。 - Oskar
可能是在代码中加载BitmapImage的重复问题。 - Robert MacLean
1个回答

27

这个 MSDN 页面 包含了你需要知道的关于 WPF 中资源 URI(通常称为打包 URI)的所有信息。你可能会更频繁地使用 相对 URI,所以请查看特别有用的表 4

如果你想要一个更简要的资源 (打包) URI 概述,请参见这篇博客文章。它显示语法确实相对简单:

pack://application:,,,/ResourceFile.xaml

pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml

然而,在我的经验中,有一些需要解决的小问题,因此通常需要进行一些实验才能找到正确的资源URI。


3
你是否考虑过在你编辑问题之前,我写回答时并没有看到你发布的链接。粗鲁是得不到好答案的。 - Noldorin
1
@mackenir:别担心,在这种情况下没关系。你试过在MSDN页面的表4中所示,直接使用相对URI吗?也许那样会更顺利一些... - Noldorin
@mackenir:上次我写了一个WPF应用程序(实际上是Silverlight,但它们都一样),我没有任何问题使用相对URI动态加载资源(包括图片),而且我还跨不同的程序集进行了加载。如果你没有成功,我可以试着找出那段代码。 - Noldorin
@mackenir:是的,那可以解释你遇到的很多问题。我会仔细考虑并尽快给出答案。 - Noldorin
啊哈,我想我知道问题出在哪里了。我试图在实例化WPF控件之前使用打包URI。应该能够重新调整代码,使其不会发生这种情况。 - mackenir
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接