[笔记/简译]XAML揭秘(1)

来源:互联网 发布:java用qq邮箱发送邮件 编辑:程序博客网 时间:2024/04/29 04:20
 

XML基础

<element xmlns="http://schema.fancy.com/test" attribute="value" />

    由于XAML实际上是一种特殊的XML文档,因此在研究XAML之前最好了解一些XML的知识。在上面的XML语句中,element称作元素(element),xmlns称作XML命名空间(namespace),attribute称作XML属性(attribute),包含在一对双引号中部分,称作值(Value)。需要注意的是,在.NET中,属性(property)是指包含getset访问器的源代码结构,与XML属性(attribute)是两回事。此外,.NET中也包含称作attribute的机制,通常译作“特性”,其与XML属性(attribute)也是两回事。

 

XAML的定义

XAML是一种相对简单的、具有通用性的、适合构造和初始化.NET对象的说明式编程语言。它由处理XML规则的解析器/编译器以及一些关键字组成,但没有定义任何用于它本身的元素,且不能脱离.NET框架使用。XAML不一定被用于WPF,由于它的通用性,因此可以被用在任何想要使用它的.NET技术中,如WF。另外,它与程序代码是相互独立的,并由此实现前端外观和后端逻辑的分离。另外需要注意的是,XAMLC#类似,都是大小写敏感的语言。

 

元素和属性(Attribute

    XAML规范定义了从.NET命名空间、类型、属性(property)和事件映射到XML命名空间、元素和属性(attribute)的规则。

例:XAML

<Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

Content="OK" />

       等价的C#代码

System.Windows.Controls.Button b = new System.Windows.Controls.Button();

b.Content = "OK";

    XAML中声明的XML元素称作“对象元素“(object element)(上例中为Button),它等价于实例化一个相应的.NET对象(总是通过其默认构造方法)。设置对象元素上的XML属性(attribute)等价于在程序代码中设置相同名称的对象属性(property),其中一般XML属性称作“对象元素属性”(property attribute),事件XML属性称作“对象事件属性”(event attribute)。(此处可能有些乱,须仔细体会)

例:XAML

    <Button xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

       Content="OK" Click="button_click" />

       等价的C#代码

System.Windows.Controls.Button b = new System.Windows.Controls.Button();

b.Click += new System.Windows.RoutedEventHandler(button_click);

b.Content = "OK";

    在运行时,XAML处理属性和事件的顺序是:(1)在对象构造完成之后设置其Name属性;(2)设置事件处理器(目的是使得对某些属性的设置能够引发合适的事件);(3)设置除Name属性外的其它属性。

至于多个对象元素属性和对象事件属性的设置,总是与它们在对象元素上的顺序相同。不过我们不必关心它,因为它由.NET设计规范负责解决。

 

命名空间

    前面的例子将XML命名空间http://schemas.microsoft.com/winfx/2006/xaml/presentation(该URL实际上并不存在,它可以是任意的字符串,可参考其它书籍对XML命名空间的介绍)映射到了.NET命名空间System.Windows.Controls,这一映射过程是通过XmlnsDefinitionAttribute特性硬编码在WPF程序集中的。

    XAML文件中,根对象元素必须至少指定一个用来限定它本身及其子元素的XML命名空间。当然我们也可以在根元素或子元素上添加额外的XML命名空间,但是每一个都必须具有独一无二的前缀用于区分彼此。

例:XAML文件一般使用前缀为x的二级命名空间:

    xmlns="http://scheams.microsoft.com/winfx/2006/xaml"

    XML命名空间会映射到System.Windows.Markup(其中除定义了一些类型之外,还定义了一些用于XAML编译器/解析器的特殊指令,这些指令通常以XML属性的形式出现,它们看起来就像是主元素的属性,但实际上并不是)。

    使用http://schemas.microsoft.com/winfx/2006/xaml/presentation作为默认命名空间,使用前缀为xhttp://scheams.microsoft.com/winfx/2006/xaml作为二级命名空间,这不过就是一个习惯,当然我们也可以使用其它任何没有冲突的名称,如:

    <Fancy:Button

       xmlns:Fancy="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

       Content="OK" Click="button_click" />

    WPF将许多.NET命名空间映射到XML命名空间http://schemas.microsoft.com/winfx/2006/xaml/presentation,如System.Windows.ControlsSystem.Windows.Data等。这是一个多对一的映射,因此我们应当避免同名的XML命名空间。

WPF的程序集为PresentationCore,其中标记了一些XmlnsDefinitionAttributeXmlnsPrefixAttribute,如:

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml",

                            "System.Windows.Markup")]

[assembly: XmlnsPrefix("http://schemas.microsoft.com/winfx/2006/xaml", "x")]前者用于映射命名空间,后者用于设置XML前缀。

原创粉丝点击