Silverlight资源字典Word文档下载推荐.docx
《Silverlight资源字典Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Silverlight资源字典Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
应用程序资源和直接资源之间的引用6
资源字典和XamlReader.Load6
从代码中引用资源7
重用资源8
资源字典和本地化9
∙适用于ResourceDictionary用法的对象
∙键和资源
∙直接资源和应用程序资源
∙从XAML中引用资源
∙合并资源字典
∙ResourceDictionary中的前向引用
∙资源字典和XamlReader.Load
∙模板中的StaticResource
∙从代码中引用资源
∙运行时用法
∙重用资源
∙generic.xaml
∙与WPF在ResourceDictionary实现上的差异
∙资源字典和本地化
∙适用于JavaScriptAPI的ResourceDictionary
∙相关主题
适用于ResourceDictionary用法的对象
在Silverlight中,并非所有类型和对象都适合ResourceDictionary用法。
为了在ResourceDictionary中定义某个对象并从其中访问该对象,该对象必须成为可共享的对象。
可共享是必要的,因为当应用程序的对象树最终完成构造并在运行时使用时,对象不能存在于树中的多个位置。
必须或者存在一个真正的共享机制,或者存在一个引用之类的间接机制。
这两种机制都要求附加的代码支持。
从UIElement类型派生的任何对象在本质上都不是可共享的,除非该对象是从控件模板生成的(Silverlight控件模板化子系统是间接机制的一个突出示例)。
SilverlightResourceDictionary用法支持以下对象类别的可共享用法:
∙样式和模板。
∙画笔和颜色。
∙包括演示图板的动画类型。
∙转换。
∙Matrix、Matrix3D和Point结构值。
∙某些具有可设置和可构造属性(例如Thickness和CornerRadius)的其他结构。
但是,这些结构通常要求在XAML中使用初始化文本以便声明有用值;
有关更多信息,请参见参考主题中的“XAML用法”部分。
∙在支持代码中定义然后在XAML中实例化为资源的自定义类型,如资源的转换器。
∙字符串和基本数值,如double和int。
请注意,XAML中对这些系统类型的对象元素用法要求您映射System命名空间和mscorlib程序集(其中基元定义后备类型)。
相关语法通常为xmlns:
sys="
clr-namespace:
System;
assembly=mscorlib"
。
有关XAML命名空间映射的更多信息,请参见SilverlightXAML命名空间以及将XAML命名空间映射为前缀。
键和资源
ResourceDictionary中的项必须各有一个定义的键。
在XAML中,可通过为作为ResourceDictionary内容添加的对象元素的x:
Key特性提供值来指派键。
说明:
在资源字典概念的Silverlight实现中,ResourceDictionary可以有x:
Name,而不是x:
Key?
?
或者二者兼而有之。
如果未指定x:
Key,则x:
Name用作键。
x:
Name/x:
Key替换支持某些应用程序可能仍在使用的旧式资源字典用法。
如果XAML包含的ResourceDictionary所包含的项具有x:
Name,但没有x:
Key,则某些工具或开发环境可能针对该XAML发出警告。
但是,x:
Key替换对于运行时XAML分析将是有效的。
如果要在XAML标记中使用键控资源,通常可以通过一个xmlns声明映射XAML语言本身的XAML命名空间。
这通常是必需的,因为x:
Name和x:
Key是由XAML语言XAML命名空间定义的。
Silverlight文档假定XAML固有的典型映射前缀为x:
因此,文档中对“Key”的引用通常采用x:
Key格式,同时预置假定的x前缀。
此外,通常还在根元素级别同时映射默认Silverlight命名空间和XAML语言XAML命名空间。
Silverlight
XAML
ResourceDictionary
中的资源必须使用字符串作为它们的键名。
有关键名的字符串值限制,请参见XamlName语法。
Silverlight中用于键名的值必须符合此语法。
如果您包括的项在资源字典中不具有可用键,则会发生分析器异常。
当您复制键时,就会发生分析器异常。
通常,如果键、无法创建的对象元素或资源查找存在问题,则在代码编译期间将不会始终检测到这些问题,仅当Silverlight在运行时尝试加载XAML时才会将它们报告为异常。
直接资源和应用程序资源
接受ResourceDictionary类型的值的两个属性是:
FrameworkElement.Resources和Application.Resources。
FrameworkElement.Resources提供直接资源。
在XAML中,可以从任何满足以下条件的元素引用FrameworkElement.Resources中的键控资源:
连接到这些资源所在的对象树。
通常,为XAML页的根元素定义FrameworkElement.Resources值,并且通常而言,对于用户应用程序来说,UI页的根元素为UserControl。
因此,常见用法是定义可由页用作UserControl.Resources内的元素的所有直接资源。
Application.Resources提供应用程序范围的资源。
无论哪个页作为应用程序的当前RootVisual加载,由Application.Resources定义的资源都是可用的。
如果将不同的可能页加载到RootVisual,并且需要一种方法来避免复制各个可能页中相同的资源,这可能很重要。
此外,如果要在运行时将值写入资源字典,应用程序作用域将提供一个可以在应用程序生存期中保存这些资源的位置。
请不要将与ResourceDictionary有关的概念同Resources生成操作、.resx文件以及在关于如何组织项目(在MSBUILD或VisualStudio等开发环境中生成应用程序)结构的上下文中讨论的其他"
资源"
相混淆。
尽管生成操作和应用程序结构的资源概念可以与ResourceDictionary用法重叠,但是ResourceDictionary通常可被视为提供自包含的资源系统,该系统将XAML作为其主要定义格式合并进来。
从XAML中引用资源
在XAML中,可通过使用StaticResource标记扩展来引用来自ResourceDictionary的现有资源。
若要使用标记扩展,应始终引用通过属性(Attribute)用法设置的属性(Property)。
例如,若要将Button的Background属性的值设置为您定义的资源,可声明以下XAML:
复制
<
ResourceDictionary>
...<
LinearGradientBrushx:
Key="
fadeBrush"
>
<
GradientStopColor="
Red"
Offset="
0"
/>
GradientStopColor="
Gray"
1"
/LinearGradientBrush>
/ResourceDictionary>
!
--XAMLwithinaUserControlorsomeotherrootthatdefinesapplicationUI-->
ButtonBackground="
{StaticResourcefadeBrush}"
.../>
在此示例中,XAML的两个部分甚至可能不位于同一XAML文件中。
ResourceDictionary可能在Resources或打包的控件主题(generic.xaml)中定义。
即使您设置的属性通常要求XAML中的属性元素用法来指定其值,您也应使用属性语法来用于资源引用。
例如,下面是等效的属性元素用法(如果以内联方式定义LinearGradientBrush,而不是引用ResourceDictionary资源):
Button>
Button.Background>
LinearGradientBrush>
/Button.Background>
/Button>
不能将StaticResource周围的属性元素用法显式用作对象元素内容。
在Silverlight中,StaticResource标记扩展仅支持用作属性值(而不支持用作对象元素)。
StaticResource的查找行为
StaticResource的查找行为是XAML的标记编译处理将首先检查应用实际用法的对象是否能够保存FrameworkElement.Resources值。
如果能,将检查该ResourceDictionary中是否有该键所对应的项。
此级别的查找并不重要,因为您通常不会在同一对象上定义并引用资源。
接下来发生的情况更重要。
查找过程将检查下一个对象树父级是否存在FrameworkElement.Resources,如果存在,则检查是否存在具有指定键字符串的字典项。
该过程一直继续,直到到达了XAML的根元素。
该过程通常在页的根级别定义所有直接资源,无论是为了利用此资源查找行为还是作为一种标记样式。
如果在直接资源中找不到请求的资源,则下一个查找步骤是检查Application.Resources。
在本文档中,直接资源有时候还称作页级别资源。
请求ResourceDictionary资源的典型XAML文件也是这样一种XAML文件:
其中,根是SilverlightUserControl,它定义第一个RootVisual或随后的“页”以便用于导航。
如果仍然找不到所请求的键,将发生XAML分析器异常。
在某些情况下,该XAML分析器异常可能是XAML标记编译检测不到的运行时异常。
有关此概念的更多信息,请参见代码隐藏和分部类。
基于此查找行为,可以特意定义多个具有与键相同的字符串值的资源,只要每个这样的资源都