《Programming WPF》翻译 第6章 3.二进制资源
原文:《Programming WPF》翻译 第6章 3.二进制资源
尽管ResourceDictionary和系统级别的资源适合于作为数据存在于对象中,然而,并不是所有的资源都能很好的满足这个模型。能够处理二进制流通常是很有用的。例如,图像,声频和视频,都是有效地二进制的代表,但是这些资源在xaml内都没有相应的标签,而且毕竟这些对象通常表现为底层数据的包装。标记语言本身代表了一种挑战:xaml页面必须编译到我们的应用程序中。因此,需要一种处理二进制流的方法。
WPF并未引进任何新技术处理二进制数据。.NET框架已经提供了处理内嵌二进制流的机制,WPF只是简单使用了这个技术。
最底层的流支持你内嵌资源流到任何的编译文件中。提供内嵌到编译器的文件是一种简单的方式。在Visual Studio 2005中,你可以通过设置一个文件的Build Action属性来支持内嵌资源。:复制该文件的内容,作为一个内嵌流放入编译文件中。使用Assembly的GetManifestResourceStream方法,可以在运行期获取到这个流,正如示例6-25所示:
示例6-25
Assembly asm = Assembly.GetExecutingAssembly( );
Stream s = asm.GetManifestResourceStream("StreamName");这种方式的内嵌流称为“资源清单”。WPF最终依赖于这种资源内嵌机制,可以通过System.Resources命名空间的ResourceManager类直接使用。这是建立在内嵌资源系统上,附加两个特点:本地化和在一个底层流中按名字存储多个流的能力。ResourceManager允许我们按照名字寻找资源,这将要尝试根据UI文化定位最合适的资源,更多细节将在下一部分描述。
按照规定,一个WPF的应用程序或组件将其所有资源放入一个单独的资源清单的中,称之为Appname.g.resources,其中Appname是程序或组件的名称(不包含扩展名)。这个单独的资源流包含二进制的资源,可以通过ResourceManager获取到。示例6-26展示了如何获取一个资源名称的清单。
示例6-26
static 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;
}让我们通过这段代码,着眼于一个典型的应用程序内部的发现资源。图6-6展示了一个WPF工程的Visual Studio 2005解决方案管理器视图。这个工程包含了通常的定义了应用程序的MyApp.xaml文件,一个定义了用户界面的Window1.xaml文件(在一个包含多个窗体和页面的应用程序中,你可以看到更多xaml文件)。这个工程还包括一个Images目录,其中有两张图片。正如你在图6-6下半部分的属性面板中看到的,Sunset.jpg的Build Action属性已经设置为Resource。当你添加一个bmp图片到解决方案中时,在解决方案管理器视图的上下文菜单,选择Add--New Item…或者Add—Existing Item…,那么这个图片的Build Action属性会自动设置为Resource。对于Wheel.jpg也是同样的设置。
图6-6

如果我们调用示例6-26中的ResourceNames函数并且打印出其返回值,可以看到下列输出:
myapp.baml
window1.baml
image/wheel.jpg
image/sunset.jpg正如你看到的,所有的bmp文件都在上面列出了。你可以在任意元素中通过指定URL的方式使用这些内嵌的图片,正如示例6-27展示的。这里使用了相对URL路径,表明这个Image元素使用的是本地资源。相对URL不仅可以用于图片文件与应用程序在同一目录,而且可以作为一个内嵌资源。既然图片数据可以内嵌在二进制程序的资源流中,那么没有必要将其转移到一个独立的包含图片数据的文件中了。
示例6-27
<Image Source="images/wheel.jpg" />上述资源列表还显示了myapp.baml和window1.baml两个资源,对应到相应的两个xaml文件。
BAML是xaml文件的二进制表现形式。Xaml在编译期间被编译成BAML格式有两个原因。首先,BAML比xaml更加显著的简捷,所以你的可执行文件比xaml文件要小得很多。其次,BAML在设计上更易于阅读,支持UI加载的速度更快——相对于xaml的语法解析。
在一个WPF工程中,任意具有Build Action的页面文件都是xaml形式。这将编译成BAML,并被内嵌为一个资源。
因为图片,BAML文件,以及任意的内嵌二进制资源都使用ResourceManager机制,这为应用程序的本地化提供了一个方法。
《Programming WPF》翻译 第6章 3.二进制资源的更多相关文章
- 《Programming WPF》翻译 第9章 5.默认可视化
原文:<Programming WPF>翻译 第9章 5.默认可视化 虽然为控件提供一个自定义外观的能力是有用的,开发者应该能够使用一个控件而不用必须提供自定义可视化.这个控件应该正好工作 ...
- 《Programming WPF》翻译 第7章 3.笔刷和钢笔
原文:<Programming WPF>翻译 第7章 3.笔刷和钢笔 为了在屏幕上绘制一个图形,WPF需要知道你想要为图形填充什么颜色以及如何绘制它的边框.WPF提供了一些Brush类型支 ...
- 《Programming WPF》翻译 第6章 5.我们进行到哪里了?
原文:<Programming WPF>翻译 第6章 5.我们进行到哪里了? WPF提供了资源工具,让我们运用在用户界面中,动态并具有一致性.我们可以在资源字典中存储任意资源,并且可以遍及 ...
- 《Programming WPF》翻译 第6章 4.应用程序全球化
原文:<Programming WPF>翻译 第6章 4.应用程序全球化 如果你打算发布你的应用程序到全球各地,你可能需要为不同地区的用户界面准备不同的版本.至少,这需要解决将文本翻译成适 ...
- 《Programming WPF》翻译 第6章 1.创建和使用资源
原文:<Programming WPF>翻译 第6章 1.创建和使用资源 资源这个词具有非常广泛的意义.任何对象都可以是一个资源.一个在用户界面中经常使用的Brush或者Color可以是一 ...
- 《Programming WPF》翻译 第9章 6.我们进行到哪里了?
原文:<Programming WPF>翻译 第9章 6.我们进行到哪里了? 只有当任何内嵌控件都没有提供你需要的底层行为时,你将要写一个自定义控件.当你写一个自定义控件,你将要使用到依赖 ...
- 《Programming WPF》翻译 第9章 4.模板
原文:<Programming WPF>翻译 第9章 4.模板 对一个自定义元素最后的设计考虑是,它是如何连接其可视化的.如果一个元素直接从FrameworkElement中派生,这将会适 ...
- 《Programming WPF》翻译 第9章 3.自定义功能
原文:<Programming WPF>翻译 第9章 3.自定义功能 一旦你挑选好一个基类,你将要为你的控件设计一个API.大部分WPF元素提供属性暴露了多数功能,事件,命令,因为他们从框 ...
- 《Programming WPF》翻译 第9章 2.选择一个基类
原文:<Programming WPF>翻译 第9章 2.选择一个基类 WPF提供了很多类,当创建一个自定义元素时,你可以从这些类中派生.图9-1显示了一组可能作为类--可能是合适的基类, ...
随机推荐
- scheme 阴阳谜题
本篇分析continuation的一个著名例子"阴阳迷题",这是由David Madore先生提出的,原谜题如下: (let* ((yin ((lambda (foo) (disp ...
- bzoj 1191
http://www.lydsy.com/JudgeOnline/problem.php?id=1191 二分+二分图匹配. 首先二分可以答对前mid道题,然后做二分图. 左边是题目,右边是锦囊. 做 ...
- 终极二分查找--传说十个人写九个有bug
之前写过一篇极为罗嗦的二分查找,非常得意地以为以后就可以避免踩坑了,但是今天才知道二分查找可以写的既简洁又鲁棒,唉!还是要多学习啊! 给一个按照从大到小的顺序排序好的数组a[]={1,2,3,4,7, ...
- 从有限状态机的角度去理解Knuth-Morris-Pratt Algorithm(又叫KMP算法)
转载请加上:http://www.cnblogs.com/courtier/p/4273193.html 在开始讲这个文章前的唠叨话: 1:首先,在阅读此篇文章之前,你至少要了解过,什么是有限状态机, ...
- lucene3.6.0 经典案例 入门教程
第一步:下载并导入lucene的核心包(注意版本问题): 例如Lucene3.6版本:将lucene-core-3.6.0.jar拷贝到项目的libs 文件夹里. 例如Lucene4.6版本:将l ...
- PHP的错误处理方式
错误类型 PHP 主要有两种错误:触发错误和异常.其中触发错误大概可以分为:编译错误.引擎错误和运行时错误,其中前两个是无法捕获的:异常都是可以捕获的,当没有尝试捕获时则会中断代码. 触发错误可以通过 ...
- JSON解析---初识
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式 全然独立于语言的文本格式 易于人阅读和编写 易于解析和生成 (网络传输速度快) JSON语法规则 数据在 ...
- File类的基本操作之InputStream字节输入流
话不多少,我直接把代码贴上来了.有什么问题请给我留言 package org.mark.streamRW; import java.io.File; import java.io.FileInputS ...
- android调试系列--使用ida pro调试so
1.工具介绍 IDA pro: 反汇编神器,可静态分析和动态调试. 模拟机或者真机:运行要调试的程序. 样本:阿里安全挑战赛第二题:http://pan.baidu.com/s/1eS9EXIM 2. ...
- SqlDbHelper备份,做项目时方便应用(目前不太全,把自己项目中的逐渐转移过来)
****************************************** 这是官网新闻左侧类别那部分用到的 **************************************** ...