资源文件的部署方式一般有以下几种
方式一:打包在XAP文件包中的独立文件。
方式二:潜入在dll程序集中的文件。
方式三:按需检测的独立文件。
具体采用哪种部署方式,实战中应根据资源的性质和实际需求灵活定制。通过资源文件的Build Action属性来设置,资源文件可用的Build Action属性有3个:
Content:当选此值时,资源文件以方式一打包在xap文件中。
Resource:当选此值时,资源文件以方式二嵌入在程序集中。
None:当选此值时,编译器不会对资源文件做任何操作,需开发者自行将其部署为按需文件,即方式三。
资源文件的访问
对于采取不同部署方式的资源文件,其访问方式也不同。其主要差别体现在用于访问文件的Uri上。在SL中有如下4种:
1)绝对Uri,形如http://www.windowsphone7.com/images/logo.jpg。
2)基于应用程序根的相对Uri,以反斜杠开始,形如/Resources/Content.jpg。
3)基于当前XAML文件位置的相对Uri,不以前反斜杠开始,形如Register.xaml、./Register.xaml、Resources/Content.jpg、../Background.png等。
4)基于程序集的相对Uri,以反斜杠开始,用以引用嵌入在程序集中的资源。
其组成形式为/[asseblyShortName]; compone
nt./[resourceLocation],其中[asseblyShortName]代表程序集名称,component为关键字,[resourceLocation]代表资源文件在程序集的相对位置,形如/Demos8;component/Resource/Resource.jpg。
Uri位于System命名空间中,最常见的两个构造方法如下:
public Uri(string uriString)。
public Uri(string uriString,UriKind uriKind)。
其中uriString参数为Uri的字符串表示,uriKind确定Uri的类型是Absolute(绝对)、Relative(相对)、RelativeorAbsolute(不确定)。以上4中方式除了第一个可以使用第一个构造函数取默认值Absolute。他三种必须使用第二个构造函数,且制定UriKind为Relative。
1. Content类型资源文件
Content类型的资源文件可以用于基于应用程序根的相对Uri或基于当前XAML文件位置的相对Uri进行访问。
可以采用以下Uri的任意一种:
Resource/Content.jpg。
/Resource/Content.jpg。
./Resource/Content.jpg。
2. Resource类型的资源文件
在WP7中,嵌入在其他程序集中的资源文件,只能通过基于程序集的Uri访问;嵌入在本程序集中的资源文件,则可以通过访问当前XAML文件位置的相对Uri进行访问。
举例:在当前项目中可以使用一下方式进行访问:
/hello;component/Resource/1.jpg。
Resource/1.jpg。
3. None类型的资源文件
None类型的资源文件为按需文件,可以部署在任意网络位置,一般通过绝对Uri访问。在某种特定的情况下也会使用异步请求的方式进行访问,但仍然需要请求其绝对Uri。
例如部署在域名为www.windowsphone7.com的web站点的/Demos8/Images/None.jgp位置,则可以通过其绝对地址问:http://www.windowsphone7.com/images/logo.jpg。
资源字典
资源字典是一种资源共享机制,可以在多个地方定义,可以在XAML中或C#中代码中使用,多数在XAML中定义可能多数使用的对象。资源字典最常见的场景有:在XAML中定义数据绑定相关的对象。具体包括样式和模版、画笔、动画对象、转换器、一般对象等。
资源字典是一个键控对象字典,对应System.Windows命名空间下的ResourceDictionary类。SL中的FrameworkElement类和Application类都可以继承资源字典。按照承载对象来分,资源字典相应的分为直接资源字典(FrameworkElement承载),和应用程序资源字典(Application承载)和独立资源文件(由XAML文件承载)3类。
1. 直接资源字典
由FrameworkElement.Resource承载的资源字典称为直接资源字典。由于Control类是FreamworkElement类的子孙类,因而几乎页面中所有的控件下都可以定义资源字典。
如下为一个Gril控件下定义的资源字典片段。
XAML Code
<Grid>
<Grid.Resources>
<!--资源一-->
<!--资源二-->
<!--......-->
</Grid.Resources>
</Grid>
由此可以知道,Gril.Resource节点世纪对应Gril的Resource属性。其中定义的资源项一般都会有一个x:Name / x:Key作为标识,然后该Gril中的所有的子孙控件都可以通过此表示引用该资源项,实现该Gril范围内的资源共享。
每一个控件下都可以定义资源字典,但是不推荐使用由于Windows phone 7中的页面是一个ApplicationPage控件,所以通常的做法是,将页面中所有的资源字典都有当前页面控件ApplicationPage来承载
2. 应用程序资源字典
对于一些可在多个页面中重复使用的资源,可在Application下定义。具体方法为直接打开App.xaml文件,然后在Application.Resource节点下进行资源定义。
在此处定义的资源,将可以在整个应用程序范围内共享。
3. 独立文件资源字典
在某种情况下,也可以将资源字典单独的定义在XAML文件中,然后在需要的地方通过C#代码动态的加载或通过Resource.Dictionary.MergedDictionary属性进行合并。如下代码将两个XAML文件resource1.xaml和resource2.xaml中的资源字典合并到当前页面地资源字典当中。