WPF会将引用到的资源如图片、BAML文件等编译成二进制数据嵌入到已经编译了的程序集中。
下图是一个反编译后的程序目录结构:
那么,如何向项目中添加资源?
- 向项目中添加文件
- 设置生成操作(Build Action)为Resource
- 重新编译项目
如何检索资源?
第一种方式,使用检索包装数据的对象StreamResourceInfo
StreamResourceInfo streamResourceInfo = Application.GetResourceStream(new Uri("welcome.png", UriKind.Relative));
第二种方式,访问Assembly.g.resources资源流,查找到具体的对象
GetResourceStream()方法中封装了ResourceManager和ResourceSet类,这俩个类负责管理资源系统。我们可以使用这两个类来访问资源流。
Assembly assembly = Assembly.GetAssembly(this.GetType()); string resourcesName = assembly.GetName().Name + ".g"; ResourceManager rm = new ResourceManager(resourcesName,assembly); using (ResourceSet set = rm.GetResourceSet(CultureInfo.CurrentCulture, true, true)) { UnmanagedMemoryStream memoryStream; memoryStream = (UnmanagedMemoryStream)set.GetObject("welcome.png",true); }
也可以将读取出来的Set遍历key值,来看一下具体的资源名称:
Assembly assembly = Assembly.GetAssembly(this.GetType()); string resourcesName = assembly.GetName().Name + ".g"; ResourceManager rm = new ResourceManager(resourcesName,assembly); using (ResourceSet set = rm.GetResourceSet(CultureInfo.CurrentCulture, true, true)) { foreach (DictionaryEntry item in set) { MessageBox.Show(item.Key.ToString()); } }