《Programming WPF》翻译 第6章 3.二进制资源

简介: 原文:《Programming WPF》翻译 第6章 3.二进制资源尽管ResourceDictionary和系统级别的资源适合于作为数据存在于对象中,然而,并不是所有的资源都能很好的满足这个模型。能够处理二进制流通常是很有用的。
原文: 《Programming WPF》翻译 第6章 3.二进制资源

尽管ResourceDictionary和系统级别的资源适合于作为数据存在于对象中,然而,并不是所有的资源都能很好的满足这个模型。能够处理二进制流通常是很有用的。例如,图像,声频和视频,都是有效地二进制的代表,但是这些资源在xaml内都没有相应的标签,而且毕竟这些对象通常表现为底层数据的包装。标记语言本身代表了一种挑战:xaml页面必须编译到我们的应用程序中。因此,需要一种处理二进制流的方法。

WPF并未引进任何新技术处理二进制数据。.NET框架已经提供了处理内嵌二进制流的机制,WPF只是简单使用了这个技术。

最底层的流支持你内嵌资源流到任何的编译文件中。提供内嵌到编译器的文件是一种简单的方式。在Visual Studio 2005中,你可以通过设置一个文件的Build Action属性来支持内嵌资源。:复制该文件的内容,作为一个内嵌流放入编译文件中。使用AssemblyGetManifestResourceStream方法,可以在运行期获取到这个流,正如示例625所示:

示例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, truetrue);
    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 文件。

BAMLxaml文件的二进制表现形式。Xaml在编译期间被编译成BAML格式有两个原因。首先,BAMLxaml更加显著的简捷,所以你的可执行文件比xaml文件要小得很多。其次,BAML在设计上更易于阅读,支持UI加载的速度更快——相对于xaml的语法解析。

在一个WPF工程中,任意具有Build Action的页面文件都是xaml形式。这将编译成BAML,并被内嵌为一个资源。

因为图片,BAML文件,以及任意的内嵌二进制资源都使用ResourceManager机制,这为应用程序的本地化提供了一个方法。

目录
相关文章
|
1月前
|
文字识别 C# 开发者
WPF开源的一款免费、开箱即用的翻译、OCR工具
WPF开源的一款免费、开箱即用的翻译、OCR工具
|
1月前
|
C#
浅谈WPF之样式与资源
WPF通过样式,不仅可以方便的设置控件元素的展示方式,给用户呈现多样化的体验,还简化配置,避免重复设置元素的属性,以达到节约成本,提高工作效率的目的,样式也是资源的一种表现形式。本文以一个简单的小例子,简述如何设置WPF的样式以及资源的应用,仅供学习分享使用,如有不足之处,还请指正。
62 0
|
C# 数据格式 XML
WPF 资源(StaticResource 静态资源、DynamicResource 动态资源、添加二进制资源、绑定资源树)
原文:WPF 资源(StaticResource 静态资源、DynamicResource 动态资源、添加二进制资源、绑定资源树) 一、WPF对象级(Window对象)资源的定义与查找 实例一: StaticR...
8178 0
WPF界面无法正常显示(资源引用,如转换器),但程序正常运行
WPF界面无法正常显示(资源引用,如转换器),但程序正常运行
WPF界面无法正常显示(资源引用,如转换器),但程序正常运行
|
C#
WPF中的一个bug造成CPU资源拉满
WPF中的一个bug造成CPU资源拉满
176 0
|
C#
WPF资源字典怎么用
资源字典的使用方法
197 0
WPF资源字典怎么用
|
C#
How do I duplicate a resource reference in code behind in WPF?如何在WPF后台代码中中复制引用的资源?
原文 https://stackoverflow.com/questions/28240528/how-do-i-duplicate-a-resource-reference-in-code-behind-in-wpf 如何在WPF后台代码中中复制引用的资源? In my application, I have a color resources.
808 0
|
C# 存储
WPF中的资源(一) - 静态资源和动态资源
原文:WPF中的资源(一) - 静态资源和动态资源 WPF中,每个界面元素都含有一个名为Resources的属性,其存储的是以“键-值”对形式存在的资源,而其子级元素在使用这些资源时会从Resources中找到这些资源。
1147 0
|
C#
WPF中的资源(二) - 二进制资源
原文:WPF中的资源(二) - 二进制资源 WPF中的二进制资源,就是类似于MFC中在对话框程序中添加的图片、字符串等资源,程序在运行时将其转换成二进制,以供程序使用。
653 0
|
C#
WPF 为资源字典 添加事件响应的后台类
原文:WPF 为资源字典 添加事件响应的后台类 前言,有许多同学在写WPF程序时在资源字典里加入了其它控件,但又想写事件来控制这个控件,但是资源字典没有CS文件,不像窗体XAML还有一个后台的CS文件,怎么办呢? 在工作时也遇到了这个问题,现在把它分享出来 比如说我们现在要写一个TabControl控件,在TabItem中有一个关闭按钮或其它按钮,这个按钮要能响应某个事件。
1566 0