配色: 字号:
WPF资源
2017-11-23 | 阅:  转:  |  分享 
  
资源几乎所有的计算机软件都要使用资源,这里的资源不是指使用CPU,内存和硬盘这样的硬件资源,而是程序中不能执行的部分。我们先从资源的定义和创
建,再到资源的访问和使用。需要指出的是WPF的资源包括风格和模板。资源定义及类型资源很早就有了,子如程序中使用到常量constf
loatpai=3.14f;这里的常数pai其实就是最简单的一种资源,在以后的程序中,在遇到用圆周率的时候,就可以用pai来
代替:floatarea=pairr;这样做的好处是:当需要修改参数pai时,只要在一个地方修改pai的值。当程
序很大时,需要使用很多这样的常量,这个时候,就把它们放到一个单独的头文件中。凡是要用到这些常数的程序,只要在相应的程序中引用这个头
文件即可,这应该是资源出现的最早的形式。可以把资源年成是程序中可以和代码分开的部分.从国际化的角度,可以把资源分成两类:一类是要随
着使用者所用的语言而改变的资源,如某个软件的英文版和中文版,其用户界面上的所有信息都要翻译成相应的语言;另一类是不需要随使用者的语
言面改变的资源,如照片等.从资源出现的方式来看,资源可以分为三类:第一类是嵌入在.net的聚合块(Assembly)中;第二类是以
单独文件出现在本地存储介质上,如.bmp,SVG等文件;第三类是以单独文件存储在异地的存储介质上,如网络盘或网站服务器上.在WPF
k,也可以根据定义资源的层次把资源分成聚合块资源(Assmebly资源)和XAML资源两大类。这种分类着眼把XAML资源和其它类
型的资源区分开来。资源双可以分为在VisualStudio项目中管理的资源和不在项目中管理的资源两种。在项目中管理的资源,最终可以
被编译到聚合块中,也可以不被编译到聚合块中,从而以独立的形式存在。不在VisualStudio项目中管理的资源,将会以独立的文件形
式存在,这种资源由程序员自己管理。若是资源文件在VisualStudio中管理,可以选择三种方式来编译项目中的资源:内容(Cont
ent)嵌入资源(EmbeddedResource)资源(Resource)设置方法是:在VisualStudio项目下,选择某
个资源文件,按下鼠标右键,在弹出的菜单中选择”属性(Properties)”,VisualStudio就显示如下的界面:内容(C
ontent)选择这种编译方式,其结果是资源文件热然以独立的文件存在,VisualStudio会在所产生的聚合块中插入资源文件在介
质上的位置信息。嵌入资源(EmbeddedResource)选择这种编译方式会把资源嵌入到目标聚合块中,程序员可以使用Resour
ceManager来读出资源倣。嵌入资源是WPF资源前.NET程序中常用的编译方式,但这种编译方式在目标聚合块中无法用统一资源标识
(Uri)来访问。在WPF中应该用Uri来访问资源,所以应当尽量不要使用这种方式编译资源资源(Resource)这是Visual
Studio专门为WPF开发的功能,ViauslStudio也会把资源编译到目标聚合块中,但是资源可以用标准的Uri访问。统一资源
标识(UnifiedResourceIdentifier)WPF引入了统一资源标识,Uri是基于OPC(OpenPackag
ingConventions)标准的一种识别资源的方式.使用Uri的优点是,可以使用统一模型来访问聚合块中,可知聚合块外,不可知
聚合块外中的资源。在VisualStudio中,XAML文件和资源文件一样会编译到目标块中或所引用的目标块中。Uri可以访问下
面基类的XAML文件WindowPagePageFunctionResourceDictionaryFlowDocumentUse
rControlUri还可以用统一的方式来加载数据文件,图像文件,.Net的聚合块以及聚合块里引用的其它聚合块等开放式封装规则(
OPC)对软件包进竺了高度抽象,首先把软件包分成一个或多个逻辑部件。一个软件包的Uri一般用下面的形式:pack://author
ity/path授权(authority)说明软件包的类型,path说明某个逻辑部伯的位置。Wpf支持两种authourty:pa
ck://applicktion:///pack://siteoforigin:///授权application:///用作访问在
编译时已经知道的文件,包括VisualStudio中管理的文件,这些文件可以是内容编译的,也可以是资源编译的,但不能是嵌入资源编
译的。授权siteoforigin:///用作访问在编译时不知道的文件,前面提到,应用程序需要访问在在VisualStudio中管
理的文件.siteoforigin容易和访问互联网相混淆,虽然它确实可以访问互联网上的资源,但其主要的目的是支持访问在编译不知道的
资源文件,标识应用程序所在的位置。如果你的应用程序在:C:\Myfloder\subfloder1那么授权siteoforigin
就是C:\Myfloder\subfloder1.若你的程序在:http://www.microsoft.com/somethin
g/那么授权siteoforigin就是http://www.microsoft.com/something/在WPF里面需要把位
于application:和siteoforigin:后面的///变成,,,.构建路径较容易理解,下面结合实例说明如何构Uri。资
源的应用程序聚合块中,这是最简单的情况。授权:application:///路径:资源的名字,包括相对于应用程序的路径。如:ap
plication:,,,/grass.jpgApplication:,,,/myfloder/grass.jpb第二个grass
.jpg位于VisualStudio的项目中位于/myfloder的子目录下。资源位于应用程序所引用的聚合块中授权:applica
tion:///路径:资源被编译到集合块中,要应用其它集合中的资源,需要给出集合块的信息。这时路径应具有下面的形式:集合块的名字[
;version][;publickKey];component/相对路径其中括号中的内容是可选的,例如:pack://appli
cation:,,,/mypthoto.dll;v1.0.0.0component/fm/maple.jpg资源不在聚合块中,但
在VisualStudio项目管理器中管理。授权:application:///路径:资源在编译时选择的是”content”,路径
要包括资源文件名及相对于聚合块的路径.例如:pack://application:,,,/mycontent.xamlpack:/
/application:,,,/subfolder/mycontent.xaml资源不在聚合块,也不在VsiualStudio的
项目管理器中管理。授权:siteoforigin:///路径:包括资源的文件名和相对于聚合块的路径。例如:pack://siteo
forigin:,,,/Subfolder/myPthot.jpgn:,,,/Resource/ICO.ico"Width="32">application:,,,/Resource/02.jpg"Width="200">ce="pack://siteoforigin:,,,/Resource/5.jpg">Uri对各种资源的配置进
行了统一处理。由于.NET支持xcopy方式安装,所以资源文件在硬盘中的绝对位置并不重要,得要的是相对于运行聚合块的相对位置。Ur
i正是基于这一情况,强调这种相对位置。.NET开发平台对资源国际化的支持随着软件在越来越多的国家使用,应用程序从设计时就要考虑对多
种语言的支持。.net开发平台从一开始就支持应用软件国际化,其中引入了一个文化(Cuture)的概念。文件可以唯一标识应用程序在某
个区域时所要做的改变,这个概念比过去的Locale和语言要精确。.NET的线程类Thread中有两个属性:CurrentCultu
re和CurrentUICulture.这两个属性的类型都是CultureInfo,通过配置这个属性,可以告诉.net开发平台应用
程序当前所处的文化环境。通常应用程序的做法有两种,一是根据操作系统的设置来确定文化;二是当用户登录系统时,确认用户身份,然后设定文
化,在这种况下,需要事先把用户的文化信息设定在数据库中(在B/S模式中通用);若是使操作系统的设置来确定文化,通常不必做什么特殊的
工作。.NET开发平台会自动根据操作系统的设置来确定线程中的CurrentCulture和CurrentUICulture.由于工
作中不常用到,了解即可。WPF元素中定义的资源前面讨论的资源都是以独立的文件的方式存在,现在要讨论WPF中的另一类资源。这类资源在
WPF元素中定义,元素通常是Window,Page,Control或Application.这些资源只能在所定义的元素或该元素的内
涵元素中才能使用,它们在应用程序中只创建一次。这类资源存储在ResourceDictionary中,ResoourceDictio
nary含有哈希表,可以使用一个关键字key来存储和访问资源。在三大基类元素:FrameworkElementFrameworkC
ontentElementApplication中都含有一个Resource属性,这个属性类型为ResourceDictionar
y.所有从FrameworkElement或FrameworkContentElement中派生出来的元素都可以在Resource
属性上加上资源,其语法如下:
资源值
在C#中定义资源的语法为:this.Resources
.Add("myElement",资源);WPF使用扩展标识方法来访问资源,WPF定义了四大类扩展标识,即:静态资源扩展标识动态扩
展标识数据绑定标识模板扩展标识静态资源(StaticResource)静态资源扩展标识是XAMLz对XML语法扩展,WPF内部使用
StaticResourceExtension类对XAML进行解释,资源关键字是其唯一属性。当程序员在XAML中进行设定资源关键字
时,StaticResourceExtension类负责访问静态资源值。访问静态资源值有两种方法,一种用属性:ourceResourceKey=”LargeFont”>另一种是使用{}FontSize=“{StaticResource
LargeFont}”h">YellowRe
d20
10>ceKey="ReadBrush">FontSize>e>红色大字按钮ound="{StaticResourceYellowBrsuh}"FontSize="{StaticResourceSm
allFont}">黄色小字按钮XAML用大括号{}来表示其中的字符串是扩展标识,那么如何显示带有字符串的
字符?如:这会产生语法错误正确做法如下:Text="{}{澧}">静态资源的作用范围前面得到,FrameworkElement和Framework
ContentElement中都含有Resource属性,而WPF中的UI元素都是从这两个类中派生出来的;换句话说,可以在任何的U
I元素内加入资源。WPF对其中的唯一要求是Key必须唯一,在UI元素中用Key来引用资源。虽然在同一个元素的资源里,不能使用同一个
Key,但在不同UI元素中可以使用已经用过的Key。资源在元素树中的传递和覆盖原则与相关属性的传递是覆盖原则一样:资源从树根向元
素向树支传递;资源在传递路径中被重新定义,则原来的资源就一再向下面的树支传递,转面传递新定义的元素。与传递事件在元素树中动态传递不
同,资源的传递实际发生在引用该资源的地方,WPF从某个元素沿着元素树向树根寻找某个资源的过程,一旦找到了某个资源,WPF就不再寻找
了,虽然表面上看起来似乎是在“传递“和”覆盖“,但其内部的机理却大不相同。静态扩展标识(Staticmakeupextens
ion)有时候在XAML中需要访问C#类中定义的静态属性,或静态域,这时,需要用到静态扩展标识。在XAML中使用静态扩展标识的语法
为:aticMemberName"...>需要注意的
是,等号两边的类型必须一致,或者在WPF中存在默认转化。xmlns:sys="clr-namespace:System;as
sembly=mscorlib"。。。使
用.net平台所提供的属性我们知道.net类Environment中提供了应用程序所在的机器的基本信息:如操作系统版本,当前目录,
命令行等。bel>>使用前要引入xmlns:sys="clr-namespace:System;assembly=mscorlib"使用自定义的静
态属性(静态域)publicpartialclassMainWindow:Window{publicstatic
doublemyFontSize=24;constfloatpai=3.14f;publicMainWind
ow(){InitializeComponent();}}xmlns:local="clr-namespace:资源定义"

在界面上显示当前时间:
时间并没有变化。其原因在于用的是静态扩展,静态扩展的最大特点是只有在程序加载时读取,此后所读取的属性和时间没有关系动态资源扩展标识(DynamicResourceMarkupExtension)WPF中的静态资源只在应用程序加载时创建一次,以后就不再变化。有的时候希望资源可以随着某些条件的变化面变化,这时候就要用到动态资源标识。使用动态资源扩的语法:另一种:和静态资源扩展不同,动态资源在编译时并不把资源赋给相关属性,而是在运行时刻,根据需要链接资源。
献花(0)
+1
(本文系luan_it首藏)