我的程序集包含一个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:由于存在冒号(':'),但由于无法解析端口,因此需要端口。”
我在此blog post
中找到了UriFormatException的修复程序但是,应用该修复程序后,我仍然会尝试从包URI加载BitmapImage。
使用pack://application:,,,/Image.png
格式时,我得到NullReferenceException,当使用pack://application:,,,/AssemblyName;component/Image.png
格式时,我得到NotSupportedException“无法识别Uri前缀”。
摘要 我的问题是我在实例化任何WPF控件/窗口/等之前尝试在进程中使用'pack URI',因此'pack'URI方案尚未注册(其他WPF所需的'东西'也必须没有也可以设置,因为手动注册包方案本身并不能解决问题)。解决方案是等到实例化我的WPF用户控件后才使用包URI。
答案 0 :(得分:20)
This MSDN page包含您可能想知道的有关WPF中资源URI的所有信息(通常称为包URI)。您可能希望更频繁地使用相对URI ,因此请参阅表4 ,这应该是特别有用的。
如果您想要简要概述资源(包)URI,请参阅this blog post。它表明语法确实相对简单:
pack://application:,,,/ResourceFile.xaml
pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml
但是,根据我的经验,有一些问题需要解决,所以经常找到正确的资源URI需要进行一些实验。