微软发布Visual Studio 2012 RC和Windows 8 Release Preview版本,从本篇开始,所有实例将基于最新版本开发工具VS2012 RC和Win 8 RP版。

 

下载Visual Studio 2012 RC :

 

http://www.microsoft.com/visualstudio/11/en-us/downloads

 

下载Windows 8 Release Preview:

 

http://windows.microsoft.com/zh-cn/windows-8/download

 

在 上几篇XAML实例教程中,分别介绍XAML对象,属性以及命名空间的概念。从这篇开始,将讨论常见的XAML高级话题,其中包括依赖属性 (Dependency Properties), 附加属性(Attached Properties), 事件处理(Event)等。这些话题是Windows 8和Silverlight实际项目中经常用到的开发知识,也是XAML开发语言的精华。

 

依赖属性(Dependency Properties)

 

 

依 赖属性,英文称为Dependency Properties,是Windows 8,Silverlight特有的属性系统。在传统.Net应用开发中,CLR属性是面向对象编程的基础,主要提供对私有字段的访问封装,开发人员可以使 用get和set访问器实现读写属性操作。在Windows 8应用开发中,依赖属性和CLR属性类似,同样提供一个实例级私有字段的访问封装,通过GetValue和SetValue访问器实现属性的读写操作。 依赖属性最重要的一个特点是属性值依赖于一个或者多个数据源,提供这些数据源的方式也可以不同,例如,通过数据绑定提供数据源,通过动画,模板资源,样式等方式提供数据源等,在不同的方式数据源下,依赖属性可以实时对属性值进行改变。也正是因为依赖多数据源的缘故,所以称之为依赖属性。

依赖属性可以通过多种不同类型的数据源进行赋值,其赋值顺序的不同影响着属性值的改变。为了能够获取准确的依赖属性值,需要了解不同数据源的优先级别,如下图:


1. 从图中可以看到,应用动画占有对以来属性控制的最高优先级,简单理解,无论动画代码定义在当前页面内,还是定义在模板代码内,动画都将获得对页面内依赖属性的最优先控制权。

2. 次一级优先权是依赖属性本地化操作,分别包括其中包括依赖属性赋值,数据绑定,资源引用等。依赖属性使用方式和CLR属性使用类似,可以使用以下格式对依赖属性进行赋值操作:

元素对象.依赖属性 = 属性值

例如: 按钮控件中,宽度属性属于依赖属性(随后实例详解),其赋值方法是: Button.Width = 160;

3. 第三优先权是数据模板和控件模板对依赖属性的控制;

4. 其次是样式控制器对依赖属性的控制优先权;

5. 最低的依赖属性控制优先权是在定义依赖属性时使用GetValue和SetValue对属性默认的赋值。

开发人员可以通过对依赖属性不同优先权的控制,操作页面属性值,使控件或者页面达到需求运行效果。
 

下面实例帮助大家理解Windows 8依赖属性优先级的应用:

该实例仍旧使用前几篇中的XamlGuide项目演示,移植到Visual Studio 2012 RC平台,

 

 

定义一个简单用户控件样式 - ButtonStyle,在样式代码中,定义了按钮的内容文本颜色(Foreground)为“Black”黑色,另外定义字体尺寸(FontSize)为24pt, 同时定义按钮文本内容(Content)是“XAML依赖属性测试”:

如果应用以上资源样式到本地按钮控件,运行结果如下:

 

 

 

但 是,如果在中定义一个按钮控件,在该按钮控件中,定义按钮文本内容(Content)为“XAML依赖属性测试”,定义按钮内容 文本颜色(Foreground)为“Yellow”×××,按钮文本字体尺寸(FontSize)为14pt,按钮宽度(Width)为200,同时调用 静态资源样式ButtonStyle.

 

 

最终运行结果如下:

 

 

根据前文讲述的依赖属性执行优先级,按钮控件本地赋值优先于控件样式,所以以上代码中,忽略了ButtonStyle样式,应用本地依赖属性值生成不同结果。

 

XAML的附加属性(Attached Properties)

 

Attached Properties,中文称为附加属性,该属性是一种特殊的依赖属性,同时也是XAML中特有的属性之一。其语法调用格式如下:

<控件元素对象 附加元素对象.附加属性名 = 属性值 />

 

我 们可以通过以下几个实例理解附加属性,例如,在布局控件Canvas中定义一个按钮控件,而按钮本身没有任何属性可以控制其在布局控件Canvas中的位 置,而在Canvas中,定义了两个依赖属性作为按钮控件的附加属性,帮助按钮控制在Canvas中的位置,其代码如下:

< Canvas >
    < Button  Canvas.Left =”25”  Canvas.Top =”30”  />
Canvas >