我怎样才能从资源获取BitmapImage?

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

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

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

但是,如何创build一个将引用embedded式资源图像的Uri?

当我尝试创build“ pack URI ”(例如pack://application:,,,/MyImage.pngpack://application:,,,/MyAssembly;component/MyImage.png )时,会引发exception:

System.UriFormatException“无效的URI:因为存在冒号(':')而期望端口,但是端口不能被分析。

我发现修复,在这篇博客文章的UriFormatException

但是,应用该修复程序,我仍然收到exception,尝试从pack URI中加载BitmapImage。

当使用pack://application:,,,/Image.png格式时,我得到一个NullReferenceException,并且在使用pack://application:,,,/AssemblyName;component/Image.png格式时,我得到一个NotSupportedException “Uri前缀不被识别”。


总结我的问题是,我正在尝试在任何WPF控件/窗口/ etc被实例化之前在一个进程中使用“pack URI”,所以“pack”URIscheme还没有注册(其他WPF所需的东西也必须不要太设置,因为手动注册包scheme本身并不能解决问题)。 解决scheme是等到实例化我的WPF usercontrol使用包URI。

此MSDN页面包含有关WPF中的资源URI(通常称为pack URI)的所有信息。 你会想要更频繁地使用相对的URI ,所以见表4 ,这应该是特别有用的。

如果您想要简要概述资源(包)URI,请参阅此博客文章 。 这表明语法确实比较简单:

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

然而,有一些怪癖(根据我的经验),经常find正确的资源URI需要一些实验。