36

我的程序集包含一个带有 BuildAction==Resource 的图像。我想从此嵌入资源中获取 BitmapImage。

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

var bitmap = new BitmapImage(new Uri(path));

但是如何创建一个引用嵌入资源图像的 Uri?

当我尝试创建“ pack URI ”(例如pack://application:,,,/MyImage.pngor pack://application:,,,/MyAssembly;component/MyImage.png)时,会引发异常:

System.UriFormatException “无效的 URI:由于存在冒号 (':'),因此需要端口,但无法解析端口。”

我在这篇博文中找到了 UriFormatException 的修复方法

但是,应用该修复程序后,我仍然会在尝试从包 URI 加载 BitmapImage 时遇到异常。

使用该pack://application:,,,/Image.png格式时,我得到一个 NullReferenceException,而在使用该pack://application:,,,/AssemblyName;component/Image.png格式时,我得到一个 NotSupportedException “Uri 前缀无法识别”。


总结 我的问题是我试图在实例化任何 WPF 控件/窗口/等之前在进程中使用“包 URI”,因此“包”URI 方案尚未注册(其他 WPF 所需的“东西”也必须也不要设置,因为手动注册打包方案本身并不能解决问题)。解决方案是等到实例化我的 WPF 用户控件后才能使用包 URI。

4

1 回答 1

23

此 MSDN 页面包含您可能想了解的有关 WPF 中的资源 URI(通常称为包 URI)的所有信息。您可能会更频繁地使用相对 URI ,因此请参阅表 4,这应该是特别有用的。

如果您想简要了解资源(包)URI,请参阅此博客文章。它表明语法确实相对简单:

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

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

但是,有一些怪癖需要解决(根据我的经验),因此通常需要进行一些实验才能找到正确的资源 URI。

于 2009-05-13T12:47:27.633 回答