XAML实例教程系列 - 资源(Resources)
Kevin Fan分享开发经验,记录开发点滴
XAML实例教程系列 - 资源(Resources)
2012-08-10 12:47 by jv9, 1386 阅读, 1 评论, 收藏, 编辑

在Windows 8 Metro应用开发中,XAML主要用于应用界面设计,无论是开发人员还是设计人员经常会设计自定义用户界面或者控件行为,其中会涉及到不同方面的代码设计,例如控件模板,控件样式,动画设计等。为了方便设计,管理和重复利用这些通用代码,XAML提出了资源(Resources)的概念。本篇将介绍 XAML资源(Resource)。
XAML资源(Resources)概念
资源(Resources),其概念和传统Web应用中的Cascading Style Sheets(CSS)样式表类似,其目的为了实现对象的重复调用。在Windows 8 Metro应用开发中,资源的概念不仅仅局限于对控件样式的定义,而且还包括对控件模板的定义,对字体的控制等。在实际项目中,开发人员可以在资源中设置多种不同控件属性,在多个页面调用通用资源代码, 这样不仅有助于代码重利用,同时有助于应用维护的一致性。
XAML中定义资源的语法格式如下:
在Windows 8 Metro应用开发中,每个Framework对象都支持Resources属性,也就是说,可以在不同控件或者页面定义特定的Resources, 例如,在Grid, Button定义Resources,
<Grid>
<Grid.Resources>
<LinearGradientBrush x:Key="bgBrush" StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="Yellow" Offset="0.0" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="Green" Offset="1.0" />
</LinearGradientBrush>
</Grid.Resources>
<Button>
<Button.Resources>
....
</Button.Resources>
</Button> </Grid>
XAML资源字典(ResourceDictionary)
XAML资源的概念在一定程度上简化了XAML页面代码,对于管理批量资源代码集合,XAML还提供<ResourceDictionary>资源字典标记进行声明。
在Windows 8 Metro应用开发中,所有能够被定义在资源字典(ResourceDictionary)的对象必须是可被共享使用的。可以被应用于资源字典的对象如下(来自MSDN):
1. Style and Template
2. Brushes and Colors
3. Animation types (Storyboard)
4. Transforms
5. Matrix and Maxtrix3D
6. Point
7. Thickness and CornerRadius
8. XAML intrinsic data types
XAML资源字典(ResourceDictionary)的定义
在资源字典(ResourceDictionary)中,每一个资源项必须定义x:Key,也就是所谓的唯一标识的资源名称,这样可以方便读取访问。例如以下代码,在Grid.Resources中定义资源x:Key = "bgBrush", 我们可以在Button中调用资源x:Key,应用资源到控件。
方法一: 在XAML中定义资源字典(ResourceDictionary),
<Grid x:Name="LayoutRoot">
<Grid.Resources>
<ResourceDictionary>
<LinearGradientBrush x:Key="bgBrush" StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="Yellow" Offset="0.0" />
<GradientStop Color="Blue" Offset="0.75" />
<GradientStop Color="Green" Offset="1.0" />
</LinearGradientBrush>
</ResourceDictionary>
</Grid.Resources>
<Button x:Name="btnSubmit" Background="{StaticResource bgBrush}"
Height="60" Width="120" Margin="112,23,168,217"/>
</Grid>
方法二: 在后台代码中定义资源字典(ResourceDictionary),
ResourceDictionary dict = new ResourceDictionary();
LinearGradientBrush bgBrush = new LinearGradientBrush();
bgBrush.StartPoint = new Point(0.5, 0);
bgBrush.EndPoint = new Point(0.5, 1);
GradientStopCollection stops = new GradientStopCollection();
GradientStop stop1 = new GradientStop();
stop1.Color = Colors.Yellow;
stop1.Offset = 0.0;
stops.Add(stop1);
GradientStop stop2 = new GradientStop();
stop2.Color = Colors.Blue;
stop2.Offset = 0.75;
stops.Add(stop2);
GradientStop stop3 = new GradientStop();
stop3.Color = Colors.Green;
stop3.Offset = 1.0;
stops.Add(stop3);
bgBrush.GradientStops = stops;
dict.Add("bgBrush", bgBrush);
this.LayoutRoot.Resources = dict;
this.btnSubmit.Background = (LinearGradientBrush)this.LayoutRoot.Resources["bgBrush"];
完成后台代码定义后,应用运行时,将自动应用资源到对象,
<Button x:Name="btnSubmit" Height="60" Width="120" Margin="112,23,168,217"/></Grid>
XAML资源字典(ResourceDictionary)的分类
在WPF开发中,XAML资源可被分为静态资源(StaticResource)和动态资源(DynamicResource)两类,但是在Windows 8 Metro应用开发中,XAML仅支持静态资源(StaticResource)。
根据资源应用域的不同,XAML资源也可被分为FrameworkElement.Resources和Application.Resources。
FrameworkElement.Resources是将资源对象应用于同一个对象树的不同对象上,也可被称为即时资源(Immediate Resources), 或者称为页面资源(Page Resources)。通常来说,FrameworkElement.Resources会被定义在XAML页面根元素上。
Application.Resources可以被认为是贯串整个应用级别的资源,资源被定义在Application.Resources中,相比 FrameworkElement.Resources而言,Application.Resources应用范围较广,其生命周期也比 FrameworkElement.Resources要长。通常来说,Application.Resources会被定已在App.Xaml页面。例如,在创建Metro应用时, Visual Studio 2012将自动生成App.Xaml页面,其代码如下:
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<!--
Styles that define common aspects of the platform look and feel
Required by Visual Studio project and item templates
-->
<ResourceDictionary Source="Common/StandardStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary> </Application.Resources>
XAML资源(Resources)引用方法
在”XAML实例教程系列 - 标记扩展(Markup Extensions) "中,曾经介绍过StaticResource(静态资源)的引用, 这里不在赘述。
需要留意的是,资源作用域是“就近原则”,如果在对象内部定义相关资源,对象会自动忽略Application.Resource,应用“最近”的资源。
XAML合并资源字典属性(ResourceDictionary.MergedDictionaries)
为了方便调用外部资源文件,资源字典(ResourceDictionary)提供了MergedDictionaries属性。 通常来说,合并资源字典属性会被定义在Application.Resources, 也就是在App.xaml文件中。
在使用合并资源字典属性时,需要注意资源的查找顺序;
在ResourceDictionary.MergedDictionaries中定义多个外部资源文件,其查找资源顺序时由下往上逆行查找的。例如:
<ResourceDictionary>
<SolidColorBrush Color="#d0157820" x:Key="muddyBrush"/>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="rd1.xaml" />
<ResourceDictionary Source="rd2.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary></Application.Resources>
在ResourceDictionary.MergedDictionaries中定义两个资源字典源,rd1.xaml和rd2.xaml。 如果在两个资源文件中存在相同x:key的资源,rd2.xaml中的资源将被优先采用。
作为外部资源合并,应用本身定义的资源永远具有较高的优先级,也就是说,如果在本地资源定义中,出现与rd1.xaml,rd2.xaml同名的资源, 本地资源都被会优先采用。
主题资源字典属性(ResourceDictionary.ThemeDictionaries)
在Windows 8 Metro应用开发中,主题资源字典(ThemeDictionaries)是一个特殊的合并资源字典。其目的是为应用提供多主题支持,提高用户体验性。创建默认Windows 8 Metro应用时,Visual Studio 2012将自动生成主题资源代码,例如:
<ResourceDictionary.ThemeDictionaries>
<x:String x:Key="BackButtonGlyph"></x:String>
<x:String x:Key="BackButtonSnappedGlyph"></x:String>
</ResourceDictionary>
<ResourceDictionary x:Key="HighContrast">
<x:String x:Key="BackButtonGlyph"></x:String>
<x:String x:Key="BackButtonSnappedGlyph"></x:String>
</ResourceDictionary>
<ResourceDictionary x:Key="GreenTheme">
<SolidColorBrush x:Key="MyBackgroundBrush" Color="Green"></SolidColorBrush>
</ResourceDictionary>
<ResourceDictionary x:Key="BlackTheme">
<SolidColorBrush x:Key="MyBackgroundBrush" Color="Black"></SolidColorBrush>
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
与MergedDictionaries属性相比较,在使用ThemeDictionaries时,需要为每个资源定义一个x:Key.例如上面的代码中的Default, HighContrast.
Windows 8 Metro应用提供默认主题资源,该文件保存在 \(Program Files)\windows kits\8.0\Include\winrt\xaml\design 目录,

对于主题资源字典(ThemeDictionaries)的应用,将在随后的Windows 8 Metro应用开发实例中详细介绍。
XAML实例教程系列到这里已经全部结束,这个系列主要是为正在或者将要学习Windows 8 Metro应用开发的新手提供XAML学习帮助,如果你在阅读中遇到问题,欢迎留言或者邮件讨论。
![]() |
本篇源代码下载 |
(Windows 8 RP & VS2012 RC)
欢迎大家留言交流,或者加入QQ群交流学习:
22308706(一群) 超级群500人
37891947(二群) 超级群500人
100844510(三群) 高级群200人
32679922(四群) 超级群500人
23413513(五群) 高级群200人
32679955(六群) 超级群500人
88585140(八群) 超级群500人
128043302(九群 企业应用开发推荐群) 高级群200人
101364438(十群) 超级群500人
68435160(十一群 企业应用开发推荐群)超级群500人
XAML实例教程系列 - 资源(Resources)的更多相关文章
- XAML实例教程系列 - 标记扩展(Markup Extensions) 六
XAML实例教程系列 - 标记扩展(Markup Extensions) 分类: Windows 8 Silverlight2012-06-21 13:00 1139人阅读 评论(0) 收藏 举报 扩 ...
- XAML实例教程系列 - 命名空间(NameSpace) 三
XAML实例教程系列 - 命名空间(NameSpace) 2012-05-28 14:14 by jv9, 2205 阅读, 10 评论, 收藏, 编辑 上一篇曾提及XAML中,每个对象元素的声明是对 ...
- XAML实例教程系列 - 依赖属性和附加属性(四)
XAML实例教程系列 - 依赖属性和附加属性 2012-06-07 13:11 by jv9, 1479 阅读, 5 评论, 收藏, 编辑 微软发布Visual Studio 2012 RC和Wind ...
- XAML实例教程系列 - 类型转换器(Type Converter)七
XAML实例教程系列 - 类型转换器(Type Converter) 分类: Windows 8 Silverlight2012-06-25 13:40 961人阅读 评论(0) 收藏 举报 butt ...
- XAML实例教程系列 - XAML传递参数到值转换类实例 八
Kevin Fan分享开发经验,记录开发点滴 XAML实例教程系列 - XAML传递参数到值转换类实例 2012-06-28 05:25 by jv9, 508 阅读, 0 评论, 收藏, 编辑 继上 ...
- XAML实例教程系列 - 事件(Event) 五
Kevin Fan分享开发经验,记录开发点滴 XAML实例教程系列 - 事件(Event) 2012-06-19 01:36 by jv9, 1727 阅读, 7 评论, 收藏, 编辑 Events, ...
- XAML实例教程系列 - 对象和属性(二)
XAML实例教程系列 - 对象和属性 2012-05-22 14:18 by jv9, 1778 阅读, 6 评论, 收藏, 编辑 在前一篇已经介绍XAML概念:“XAML语言是Extensible ...
- XAML实例教程系列 - 开篇(一)
XAML实例教程系列 - 开篇 2012-05-14 11:47 by jv9, 5588 阅读, 8 评论, 收藏, 编辑 去年,曾答应银光中国论坛的朋友推出一个关于XAML语言实例教程系列,帮助学 ...
- Silverlight,Windows 8应用开发实例教程系列汇总
Kevin Fan分享开发经验,记录开发点滴 Silverlight,Windows 8应用开发实例教程系列汇总 2012-06-18 01:05 by jv9, 2145 阅读, 3 评论, 收藏, ...
随机推荐
- 梦想CAD控件系统变量说明
这里介绍一些常用系统变量有String.double.long.McGePoint3d等类型,其中有部分系统变量是随图纸保存,再次打开时就会读取图纸中的系统变量,有些系统变量不随图纸保存,其作用来控制 ...
- Python函数式编程简介
参考原文 廖雪峰Python函数式编程 函数 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程 ...
- js识别手机访问自动跳转到相应页面
/* * 智能机浏览器版本信息: * */ var browser={ versions:function(){ var u = navigator.userAgent, app = navigato ...
- MFC 程序 手写创建顺序
MFC 程序 手写创建顺序 1.继承CWinApp类 覆盖 class CMyApp : public CWinApp { virtual BOOL InitInstance(); } BOOL CM ...
- idea搭建maven项目 【转发】
为了创建maven项目可是花了我时间了,网上的教程跟我的实际情况不符合,尤其是facets .artifacts 那块.幸亏找到这篇文章没解决了我的问题,他的描述跟我的情况一模一样.这篇文章竟然来自百 ...
- CCF201703-2 学生排队 java(100分)
试题编号: 201703-2 试题名称: 学生排队 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 体育老师小明要将自己班上的学生按顺序排队.他首先让学生按学号从小到大的顺序排 ...
- Python基础之函数参数与返回值进阶
参数作用:如果外界希望在函数内部处理数据,就可以将数据作为参数传入函数内部: 返回值作用:如果希望一个函数函数执行完成后,向外界报告函数的执行结果,就可以使用函数的返回值. 函数的返回值 进阶 利用元 ...
- HTML-js 压缩上传的图片方法(默认上传的是file文件)
//压缩图片方法 function compressImg(file,callback){ var src; var fileSize = parseFloat(parseInt(file['size ...
- [bzoj1500][NOI2005 维修数列] (splay区间操作)
Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目. 第2行包含N个数字,描述初始时的数列. 以下M行,每 ...
- 【Codeforces 466B】Wonder Room
[链接] 我是链接,点我呀:) [题意] 让你把长为a,宽为b的房间扩大(长和宽都能扩大). 使得它的面积达到6*n 问你最小的能满足要求的面积是多少 输出对应的a和b [题解] 假设a< b ...
