首页 / 软件开发 / .NET编程技术 / 《Programming WPF》翻译 第6章 3.二进制资源
《Programming WPF》翻译 第6章 3.二进制资源2011-09-11 博客园 包建强尽管ResourceDictionary和系统级别的资源适合于作为数据存在于对象中, 然而,并不是所有的资源都能很好的满足这个模型。能够处理二进制流通常是很 有用的。例如,图像,声频和视频,都是有效地二进制的代表,但是这些资源在 xaml内都没有相应的标签,而且毕竟这些对象通常表现为底层数据的包装。标记 语言本身代表了一种挑战:xaml页面必须编译到我们的应用程序中。因此,需要 一种处理二进制流的方法。WPF并未引进任何新技术处理二进制数据。.NET框架已经提供了处理内嵌二进 制流的机制,WPF只是简单使用了这个技术。最底层的流支持你内嵌资源流到任何的编译文件中。提供内嵌到编译器的文 件是一种简单的方式。在Visual Studio 2005中,你可以通过设置一个文件的 Build Action属性来支持内嵌资源。:复制该文件的内容,作为一个内嵌流放入 编译文件中。使用Assembly的GetManifestResourceStream方法,可以在运行期 获取到这个流,正如示例6-25所示:示例6-25Assembly asm = Assembly.GetExecutingAssembly( );
Stream s = asm.GetManifestResourceStream("StreamName");
这种方式的内嵌流称为“资源清单”。WPF最终依赖于这种资源内嵌机制,可 以通过System.Resources命名空间的ResourceManager类直接使用。这是建立在 内嵌资源系统上,附加两个特点:本地化和在一个底层流中按名字存储多个流的 能力。ResourceManager允许我们按照名字寻找资源,这将要尝试根据UI文化定 位最合适的资源,更多细节将在下一部分描述。按照规定,一个WPF的应用程序或组件将其所有资源放入一个单独的资源清单 的中,称之为Appname.g.resources,其中Appname是程序或组件的名称(不包含 扩展名)。这个单独的资源流包含二进制的资源,可以通过ResourceManager获 取到。示例6-26展示了如何获取一个资源名称的清单。示例6-26static List<string> GetResourceNames(Assembly asm,
System.Globalization.CultureInfo culture) {
string resourceName = asm.GetName( ).Name + ".g";
ResourceManager rm = new ResourceManager(resourceName, asm);
ResourceSet resourceSet = rm.GetResourceSet(culture, true, true);
List<string> resources = new List<string>( );
foreach (DictionaryEntry resource in resourceSet) {
resources.Add((string) resource.Key);
}
rm.ReleaseAllResources( );
return resources;
}