标签:
原文:《Programming WPF》翻译 第6章 3.二进制资源尽管ResourceDictionary和系统级别的资源适合于作为数据存在于对象中,然而,并不是所有的资源都能很好的满足这个模型。能够处理二进制流通常是很有用的。例如,图像,声频和视频,都是有效地二进制的代表,但是这些资源在xaml内都没有相应的标签,而且毕竟这些对象通常表现为底层数据的包装。标记语言本身代表了一种挑战:xaml页面必须编译到我们的应用程序中。因此,需要一种处理二进制流的方法。
WPF并未引进任何新技术处理二进制数据。.NET框架已经提供了处理内嵌二进制流的机制,WPF只是简单使用了这个技术。
最底层的流支持你内嵌资源流到任何的编译文件中。提供内嵌到编译器的文件是一种简单的方式。在Visual Studio 2005中,你可以通过设置一个文件的Build Action属性来支持内嵌资源。:复制该文件的内容,作为一个内嵌流放入编译文件中。使用Assembly的GetManifestResourceStream方法,可以在运行期获取到这个流,正如示例6-25所示:
示例6-25
这种方式的内嵌流称为“资源清单”。
Stream s = asm.GetManifestResourceStream("StreamName");
按照规定,一个WPF的应用程序或组件将其所有资源放入一个单独的资源清单的中,称之为Appname.g.resources,其中Appname是程序或组件的名称(不包含扩展名)。这个单独的资源流包含二进制的资源,可以通过ResourceManager获取到。示例6-26展示了如何获取一个资源名称的清单。
示例6-26
让我们通过这段代码,着眼于一个典型的应用程序内部的发现资源。图
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;
}
图6-6
如果我们调用示例6-26中的ResourceNames函数并且打印出其返回值,可以看到下列输出:
正如你看到的,所有的bmp文件都在上面列出了。你可以在任意元素中通过指定URL的方式使用这些内嵌的图片,正如示例6-27展示的。这里使用了相对URL路径,表明这个Image元素使用的是本地资源。相对URL不仅可以用于图片文件与应用程序在同一目录,而且可以作为一个内嵌资源。既然图片数据可以内嵌在二进制程序的资源流中,那么没有必要将其转移到一个独立的包含图片数据的文件中了。
示例6-27
上述资源列表还显示了
BAML是xaml文件的二进制表现形式。Xaml在编译期间被编译成BAML格式有两个原因。首先,BAML比xaml更加显著的简捷,所以你的可执行文件比xaml文件要小得很多。其次,BAML在设计上更易于阅读,支持UI加载的速度更快——相对于xaml的语法解析。
在一个WPF工程中,任意具有Build Action的页面文件都是xaml形式。这将编译成BAML,并被内嵌为一个资源。
因为图片,BAML文件,以及任意的内嵌二进制资源都使用ResourceManager机制,这为应用程序的本地化提供了一个方法。
《Programming WPF》翻译 第6章 3.二进制资源
标签:
原文地址:http://www.cnblogs.com/lonelyxmas/p/4962928.html