如何从资源中获取BitmapImage?

7 浏览
0 Comments

如何从资源中获取BitmapImage?

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

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

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

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

当我尝试创建一个“pack URI”(例如pack://application:,,,/MyImage.png或pack://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。

0
0 Comments

如何从资源中获取BitmapImage?

在使用WPF中资源URI(也称为pack URI)时,有一些问题需要解决。下面是一些相关讨论的摘录:

根据MSDN页面上的信息,你可以在这个页面上找到关于WPF资源URI的所有信息。你可能更常使用相对URI,可以参考Table 4,它应该对你有所帮助。

如果你想要一个简要的资源URI概述,可以参考这篇博文。它展示了语法相对简单的方式:

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

然而,根据我的经验,有一些细节需要注意,因此通常需要一些实验来找到正确的资源URI。

某些情况下使用相对URI,但担心这会被解释为文件路径。应该尝试使用相对URI,可能会有更多的运气。

有人发现当他们使用相对格式指定一个Uri时,BitmapImage构造函数将其解释为文件路径。例如,new Uri("/Image.png", UriKind.Relative)被解释为c:\Image.png。可能是BitmapImage构造函数没有正确处理pack URI。

有人尝试在一个非WPF应用程序中使用WPF,并发现一些问题。但在一个简单的测试WPF应用程序中,所有以下URI都有效:

new Uri("/Image.png", UriKind.Relative)

new Uri("Image.png", UriKind.Relative)

new Uri("pack://application:,,,/Image.png", UriKind.Absolute)

new Uri("pack://application:,,,/WpfApplication5;component/Image.png", UriKind.Absolute)

所以问题可能出在宿主进程中(它在一个Visual Studio插件中运行)。

针对以上问题,有人提出了一个解决方案,他们认为问题可能是在实例化WPF控件之前尝试使用pack URI,可以重新调整代码以解决这个问题。

由于使用的WPF是由一个进程动态加载的程序集,因此需要使用指定程序集名称的绝对pack URI。

通过这些讨论,我们可以得出解决方法:在使用pack URI之前,确保已经实例化了WPF控件,并使用指定程序集名称的绝对pack URI。

0