黑马-程序员剖析最简单的XAML代码

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ---------------------- 
<Window x:Class="点滴.Window1"     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"               //xmlns特征的语法格式如下,.xmlns[:可选的映射前缀]="名称空间" .* /?;'    Title="Window1" Height="300" Width="300">     <Grid>             </Grid> </Window>
TBv-W1L   ?H"ef#O   XAML是一种由XML派生而来的语言,所以很多XML中的概念在XAML是通用的。比如,使用标签声明一个元素(每个元素对应内存中的一个对象)时,需要使用起始标签<Tag>和终止标签</Tag>,夹在起始标签和终止标签中的XAML代码表示是隶属于这个标签的内容。如果没有什么内容隶属于某个标签,则这个标签称为空标签,可以写为<Tag/>。 x \kPgAzF   j@VA#J+M   为了表示同类标签中的某个标签与众不同,可以给它的特征(Attribute)赋值。为特征赋值的语法如下: _Ph#!iQ   eQxn1^Z:Q   非空标签:      <Tag Attribute1=Value1 Attribute2=value2>Content</Tag> ZuB #6qE   V8PW 3eW   空标签:          <Tag Attribute1=Value1 Attribute2=value2/> $. x.c6K   PAW&gw( f&   在这里,有必要把Attribute和Property这两个词仔细地辨别一下。 UiHHYe!Ym   Sysc#Fb   这两个词的混淆由来已久。混淆的主要原因就是大多数中文译本里既把Attribute译为"属性",也把Property译为"属性"。其实,这两个词所表达的不是一个层面上的东西。 R9~:S'   `3N!Y}U6N   Property属于面向对象理论范畴。在使用面向对象思想编程的时候,常常需要对客观事物进行抽象,再把抽象出来的结果封装成类,类中用来表示事物状态的成员就是Property。比如要写一个模拟赛车的游戏,那么必不可少的就是对现实汽车的抽象。现实中的汽车身上会带有很多数据,但在游戏中可能只关心它的长度、宽度、高度、重量、速度等有限的几个数据,同时,还会把汽车"加速"、"减速"等一些行为也提取出来并用算法模拟,这个过程就是抽象(结果是Car这个类)。显然,Car.Length、Car.Height、Car.Speed等表达的是汽车当前处在一个什么状态,而Car.Accelerate()、Car.Break()表达的是汽车能做什么。因此,Car.Length、Car.Height、Car.Speed就是Property的典型代表,将Property译为"属性"也很贴切。总结一句话就是:Property(属性)是针对对象而言的。 +%$teG   a^k.X   Attribute则是编程语言文法层面的东西。比如有两个同类的语法元素A和B,为了表示A与B不完全相同或者A与B在用法上有些区别,这时候就要针对A和B加一些Attribute。也就是说,Attribute只与语言层面上的东西相关,与抽象出来的对象没什么关系。因为Attribute是为了表示"区分"的,所以把它译为"特征"。C#中的Attribute就是这种应用的典型例子,我们可以为一个类添加Attribute,这个类的类成员中有很多Property。显然Attribute只是用来影响类在程序中的用法,而Property则对应着抽象对象身上的性状,它们根本不是一个层面上的东西。 NVN[(meH   LabM-oa&   习惯上,英文中把标签式语言中表示一个标签特征的"名称-值"对称作Attribute。如果恰好又是用一种标签语言在进行面向对象编程,这时候两个概念就有可能混淆在一起了。实际上,使用能够进行面向对象编程的标签式语言只是把标签与对象做了一个映射,同时把标签的Attribute与对象的Property也做了一个映射--针对标签还是叫Attribute,针对对象还是叫Property,仍然不是一个层面上的东西。而且,标签的Attribute与对象的Property也不是完全映射的,往往是一个标签所具有的Attribute多于它所代表的对象的Property。 pY)C dq^Q   @>caq <.C   因为XAML是用来在UI上绘制控件的,而控件本身就是面向对象抽象的产物,所以XAML标签的Attribute里就有一大部分是与控件对象的Property互相对应的。当然,这还意味着XAML标签还有一些Attribute并不对应控件对象的Property。
 
Sy@u.v]K0  XAML是一种"声明"式语言,当你见到一个标签,就意味着声明了一个对象,对象之间的层级关系要么是并列、要么是包含,全都体现在标签的关系上。 YM("1p*   'ufHF [#Mp   下面这些代码就都是标签的Attribute。 XVXLz   _9[^MpBL   1.x:Class="MyFirstWpfApplication.Window1"
 2.xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation                          //默认名称空间只能有一个
 4.Title="Window1" Height="300" Width="300" 其中,Title、Height和Width一看就知道是与Window对象的Property相对应的。中间两行(即两个xmlns)是在声明名称空间。最上面一行是在使用名为Class的Attribute,这个Attribute来自于x:前缀所对应的名称空间。下面仔细解释。 ac%xjyHb   m o;Qbc   前面已经说过,XAML语言是从XML语言派生出来的。XML语言有一个功能就是可以在XML文档的标签上使用xmlns特征来定义名称空间(Namespace),xmlns也就是XML-Namespace的缩写了。定义名称空间的好处就是,当来源不同的类重名时,可以使用名称空间加以区分。xmlns特征的语法格式如下: .* /?;'   3j9!m|x3B   1.xmlns[:可选的映射前缀]="名称空间"
xmlns后可以跟一个可选的映射前缀,之间用冒号分隔。如果没有写可选映射前缀,那就意味着所有来自于这个名称空间的标签前都不用加前缀,这个没有映射前缀的名称空间称为"默认名称空间"--默认名称空间只能有一个,而且应该选择其中元素被最频繁使用的名称空间来充当默认名称空间。上面的例子中,和都来自由第二行声明的默认名称空间。而第一行中的Class特征则来自于第三行中x:前缀对应的名称空间。这里可以做一个有趣的小实验:如果给第二行声明的名称空间加上一个前缀,比如n,那么代码就必须改成这样才能编译通过: 5=S/Q7;p   <n:Window x:Class="点滴.Window1"     xmlns:n="http://schemas.microsoft.com/winfx/2006/xaml/presentation"     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"              
    Title="Window1" Height="300" Width="300">     <n:Grid>             </n:Grid> </n:Window>
E [JT-% i  XAML中引用外来程序集和其中.NET名称空间的语法与C#是不一样的。在C#中,如果想使用System.Windows.Controls名称空间里的Button类,需要先把包含System.Windows.Controls名称空间的程序集PresentationFramework.dll通过添加引用的方式引用到项目中,然后再在C#代码的顶部写上一句using System.Windows.Controls;。
在XAML中做同样的事情也需要先添加对程序集的引用 ,然后再在根元素的起始标签中写上一句:
xmlns:c="clr-namespace:System.Windows.Controls; assembly=PresentationFramework"。c是映射前缀,换成其他的字符串(如control)也可以。因为Button来自前缀c对应的名称空间,所以在使用Button的时候就要成<c:button>...</c:button>。 C ;y>({K   GLvr<`G0   xmlns:c="clr-namespace:System.Windows.Controls;assembly=PresentationFramework",这么长的一串字符看上去的确有点恐怖,但不用担心,VS 2008是有自动提示功能的.Xxv'Ne}{<   9^Z'm_${S   在VS 2008自动提示的顶部,你会看到几个看上去像网页地址的名称空间,其中就包含例子代码中的那两行。为什么名称空间看上去像是一个主页地址呢?其实把它copy到IE的地址栏里尝试跳转也不会打开网页。这里只是XAML解析器的一个硬性编码(hard-coding),只要见到这些固定的字符串,就会把一系列必要的程序集(Assembly)和程序集中包含的.NET名称空间引用进来。 \V2U6nzkV
---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------  

posted on 2012-12-22 20:06  阮佳佳  阅读(276)  评论(0编辑  收藏  举报

导航