来自:http://blog.csdn.net/aoshilang2249/article/details/44158403

剖析最简单的XMAL代码:

[html] view plain copy
  1. <Window x:Class="MyFirstApplication.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="MainWindow" Height="350" Width="525">
  5. <Grid>
  6. </Grid>
  7. </Window>

花花绿绿一大片,还有两个像主页地址的东西....它们都是些什么呢,让我们一个个来分析。

XAML是由XML派生出来的语言,所以有很多在XML中的概念在XAML中是通用的。比如使用标签声明一个元素(每一个元素对应内存中的一个对象)时,需要使用起始标签<tab>和结束标签</tag>,夹在起始标签和终止标签中的XAML代码表示隶属于这个标签的内容。如果没有什么内容隶属于这个标签,则这个标签称为空标签,可以写为<tag/>。

为了表示同类标签中的某个标签的与众不同,可以给它的特征(Attribute)赋值。为特征赋值的语法如下:
    非空标签:<tag Attribute1=value1 Attribute2=value2>content</tag>
    空标签<tag Attribute1=value1 Attribute2=value2/>

在这里有必要把Attribute和Property仔细地辨别一下。

这个词的混淆由来已久,混淆的主要原因是大多数的中文译文里即把Attribute译为“属性”,也把Property译为“属性”,其实,这两个词表示的不是同一个层面上的东西。

Property属于面向对象的范畴。在使用面向对象编程的时候,常常需要对客观事物进行抽象,在把抽象出来的结果封装成类,类中用来表示事物状态的成员就是Property。比如要编写一个模拟赛车的游戏,那么必不可少的就是要对现实的赛车进行抽象,现实中汽车会带很多数据,但是游戏中可能只关心它的长度,宽度,高度,重量,速度等有限的几个数据,同时,还会把汽车的加速,减速等行为提取出来用算法进行模拟,这个过程就是属于抽象(结果是Car这个类)。显然,Car.Length,Car.Height,Car.Weight等表达的是当前汽车所处的一个状态,而Car.Accelerate()、Car.Break()表达的是汽车能做什么。因此,Car.Length,Car.Height就是Property的典型属性,是针对对象而言的。将Property译为“属性”也很贴切,总之一句话:Property属性是针对对象而言的。

Attribute则是编程语言文法层面的东西。比如有两个同类语法的元素A和B,为了表示A与B不完全相同或者A与B的用法上有些区别,这时候就要针对A和B加一些Attribute。也就是说Attribute只与语言层面上的东西有关,与抽象出来的对象没有什么关系。因为Attribute是为了表示“区分”的。所以它译为“特征”。C#中的Attribute就是这种应用的典型例子,我们可以为一个类添加Attribute,这个类里面有很多Property(属性)。显然,Attribute只用来影响类中程序中的用法,而Property 则对应着抽象对象身上的性状,根本不是一个层面上的东西。

习惯上,英语中把标签式语言中表示一个标签特征的“名----值”对称做Attribute。如果恰好有在使用一种标签式语言做面向对象编程,这两个概念就有可能混在一起了。实际上,使用能够使用面向对象编程的标签式语言只是把标签和对象做了一个映射-----针对标签还是叫做Attribute,针对对象还是叫做Property,仍然不是一个层面上的东西。而且,标签的Attribute不是和对象的Property一一映射的,往往一个标签对于的Atrribute大于他所映射对象的Property。

因为XAML是用来在UI上绘制控件的,而控件本身就是面向对象的抽象产物,所以XAML标签中的Atrribute有一大部分和它对应他的对象的Property是一一对应的。当然,这还意味着标签中的Atrribute并不对应它所代表对象的Property。

明白了XAML的格式以及Atrribute和Property之间对应的关系,对上面的代码可谓是一目了然。它的总体结构是一个Window标签内包含一个Grid标签(或者说Grid标签是Window标签的内容),所代表的内容是一个Window对象里面包含一个Grid对象。

XAML是一种声明式语言,当你看见一个标签,就证明你声明了一个对象,对象之间的关系要么是并列,包含全都体现在标签的关系上。
下面的代码就是<Window>标签的Atrribute。

[html] view plain copy
  1. x:Class="MyFirstApplication.MainWindow
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml
  4. Title="MainWindow" Height="350" Width="525"

其中Title、Width、Height一看就知道和Window的Property对象对应的。中间两行(即两个xmlns)是在声明名称空间。最上面一行是在使用名为class的Attribute, 这个Attribute来自于X:前缀所对应的名称空间 。下面仔细解释。

前面已经说过,XMAL语言是从XML语言派生而来的。XML有一个功能就是可以在XML文档的标签内使用xmlns特征来定义名称空间(NameSpace),XML也就是XML--NameSpace的缩写。定义名称空间的好处就是,当来源不同的类重名时,可以使用名称空间加以区分。xmlns特征的语法如下:

[html] view plain copy
  1. xmlns[:可选的映射前缀]=“名称空间”

xmlns后可以跟一个可选的映射前缀,之间用冒号隔开。如果没有写可选映射的前缀,那就意味着所有来自这个名称空间的所有标签都不用加这个前缀,这个没有映射的命名空间称为“默认的命名空间”,默认名称空间只能有一个,而且应该选择其中使用最频繁的名称空间来作为默认命名空间。在上面的例子中,<Window>和<Grid>来自于第二行声明的默认命名空间,而第一样的CLASS特征则来来自于三行的中x:前缀对应的名称空间。这里可以做一个有趣的小实验:如果给第二行声明的名称空间加一个前缀,例如n,那么代码必须要改成一下形式编译才能通过:

[html] view plain copy
  1. <n:Window x:Class="WpfApplication2.Window2"
  2. xmlns:n="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="Window2" Height="300" Width="300">
  5. <n:Grid>
  6. </n:Grid>
  7. </n:Window>

XAML中引用外来程序集和其中.NET名称空间的语法和C#是不一样的。在C#中,如果想使用System.Windows.Control名称空间内的Button类,需要先把包含System.Windows.Control名称空间的程序集PresentationFramework.dll添加引用到项目中,然后再用C#代码顶部写上一句:using System.Windows.Control;。

在XAML中做同样的事情也需要添加对程序集的引用,然后再在根元素的起始标签中写上一句:xmlns:c="clr-namespace:System.Windows.Control;assembly=PresentationFramework"。c是映射的前缀,换成其它字符串也可以。因为button来自前缀为c的命名空间,所以在使用button的时候就要使用<c:Button>....</c:Button>。

xmlns:c="clr-namespace:System.Windows.Control;assemble=PresentationFramework",这么长的一串字符串看上去的确有点恐怖,但不用担心,VS中有自动提示功能。
在VS自动提示的顶部,你会看到几个像网站地址的几个名称空间,其中就包含例子代码中的那两行。为什么名称空间看上去像一个网站地址呢。其实把它copy到浏览器地址栏尝试跳转也不会打开网页。这里只是XAML解释器的一个硬性编码(hard-coding),只要见到这些固定的字符串,就会把一系列的程序集和程序集中包含的名称空间引入进来。

默认引入的这两个名称空间格外的重要,它们对应的程序集和.net名称空间如下:

http://schemas.microsoft.com/winfx/2006/xaml/presentation对应:

[html] view plain copy
  1. System.Windows;
  2. System.Windows.Automation;
  3. System.Windows.Control;
  4. System.Windows.Control.Primitives;
  5. System.Windows.Data;
  6. System.Windows.Document;
  7. System.Windows.Forms.Intergration;
  8. System.Windows.Ink;
  9. System.Windows.Input;
  10. System.Windows.Media;
  11. System.Windows.Media.Animation;
  12. System.Windows.Media.Effects;
  13. System.Windows.Media.Imaging;
  14. System.Windows.Media.Media3D;
  15. System.Windows.Media.TextFormmatting;
  16. System.Windows.Navigation;
  17. System.Windows.Shapes;

也就是说你可以在XAML中可以直接使用这些CLR名称空间下的类型(因为默认XML名称空间前没有前缀)。

http://schemas.microsoft.com/winfx/2006/xaml则对应一些与XAML语法和编译相关的CLR名称空间, 使用这些名称空间中的类型需要加上前缀x,因为它们被映射到x的XML名称空间中。

从这两个名称空间的名字和它所对应的.NET程序集上,这个不难看出,第一个空间名称对应的是绘制UI相关的程序集,是表示(Presentation)层面上的东西;第二个名称空间则对应着XAML解析处理相关的程序集,是语言层面上的东西。

最后让让我回到最初的代码。你可能会问:在XAML里面有x:Class="MyFirstApplication.MainWindow",在MainWindow.xaml.cs里面也声明了MainWindow这个类,难道他们不会冲突吗?仔细看看MainWindow.xaml.cs中MainWindow的声明就知道了----在声明的时候使用的是partial关键字,这样,这样由XAML中解析成的类和C#文件里面定义的部分就合二为一了,正是由于这种partial机制,我们可以把逻辑代码留在.cs文件里,用C#语言来实现,而把那些声明及布局UI元素的代码分离出去,实现UI和逻辑分离,并且,用于绘制UI的代码(如声明控件类型的字段,设置它们的外观和布局等)也不必再使用C#语言,使用XAML和XAML编辑工具就可以轻松搞定。

参考《深入浅出WPF》

WPF XAML 从零开始认识XAML相关推荐

  1. WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形

    原文:WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形 说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘> ...

  2. WPF Unleashed Chapter 2:XAML Demystified 翻译(第二部分)

    上一篇WPF Unleashed Chapter 2:XAML Demystified 翻译(第一部分) 声明: 本译文仅供学习讨论,禁止用于商业用途,否则后果自负 类型转换(Type Convert ...

  3. 关于WPF(二)XAML

    XAML XAML(Extensible Application Markup Language的简写,发音为"zammel")是用于实例化.NET对象的标记语言.尽管XAML是一 ...

  4. wpf工程中在Xaml文件下添加多个cs文件

    在wpf工程中我们添加一个Window或者UserControl都会建立2个文件, xxx.xaml和xxx.xaml.cs.而且一般cs文件在xaml文件下面. 有这样的一个场景,大家都知道这些cs ...

  5. 使用 XAML 格式化工具:XAML Styler

    1. XAML 的问题 刚入门 WPF/UWP 之类的 XAML 平台,首先会接触到 XAML 这一新事物.初学 XAML 时对它的印象可以归纳为一个词:一坨. 随着我在 XAML 平台上工作的时间越 ...

  6. Xamarin XAML语言教程XAML文件结构与解析XAML

    Xamarin XAML语言教程XAML文件结构与解析XAML XAML文件结构 在上文中,我们创建XAML文件后,会看到类似图1.16所示的结构 图1.16  结构 其中,.xaml文件和.xaml ...

  7. WPF,Silverlight与XAML读书笔记第八 - WPF新概念之三路由事件

    说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘>的编排,对内容进行了总结并加入一些个人理解. 路由事件是专门设计用于在元素树中使用的事件. ...

  8. 艾伟_转载:WPF/Silverlight陷阱:XAML自定义控件的嵌套内容无法通过名称访问

    为了说明这个问题,假定我们需要实现一个具有特殊功能的按钮控件.编写Xaml文件如下: <Button x:Class="TestWpf.XamlButton"     xml ...

  9. WPF ----在UserControl的xaml里绑定依赖属性

    场景:在定义wpf 用户控件的时候,希望使用时设置自定义的属性来改变用户控件里的状态或内容等. 下面直接上实例代码: 用户控件的后台代码,定义依赖属性 public partial class MyU ...

最新文章

  1. 机器学习中的算法(4.2):SVM----针对线性可分问题理解
  2. 双向循环神经网络_情感分析:基于循环神经网络
  3. 实现一个域名对应多个IP地址和DNS优缺点详解!
  4. php5.5.9 新特性,php,_PHP 5.5.9版本中COOKIE的奇怪现象,php - phpStudy
  5. JS 中 indexOf 的用户及注意事项
  6. jboss架构_检查Red Hat JBoss BRMS部署架构的规则和事件(第二部分)
  7. Maven整合Spring3.0+Mybatis3.2+Struts2.3+查找坐标+jar包依赖(五)
  8. Mac OS X下安装Java 7及配置Eclipse JDK
  9. 学习 | Node.js 之定时任务
  10. list 转set_MapStruct高级用法:List和String互转
  11. Apache 简单设置虚拟主机
  12. vue-cli的router/index.js跳转出问题了
  13. 【SQL学习+练习篇】基础训练,适用于初学者(一)
  14. 计算机操作系统轮转算法代码,实验四 时间片轮转调度算法
  15. VGG16模型详解 and 代码搭建
  16. Xcopy 复制文件和目录,包括子目录。
  17. 方差 标准差_标准差和标准误的区别是什么?计算统计学方差的时候,为什么总要除以样本数?...
  18. esp分区引导修复失败_ESP分区丢失,新建ESP分区修复引导教程
  19. 如何解决VMware Workstation上ubuntu出现Host SMbus controller not enabled
  20. 纵行科技联合Kinéis等欧洲企业,开发ZETA星地融合低功耗物联网芯片

热门文章

  1. 《 Docker 技术入门与实战 》读书笔记 ( CentOS 安装 Docker )
  2. sql语句update中多个case/when的写法
  3. Astyle 一键格式化项目代码
  4. Datawhale MySQL 训练营 Task2 查询语句
  5. 在云服务器上注意GeoServer和ShadowDataMap的跨域设置
  6. CF #366(div.2) C 模拟,思维
  7. Entity Framework在WCF中序列化的问题(转)
  8. FLEXAIR 界面展示。
  9. 用TortoiseGit时的实用git命令
  10. day16-Dom提交表单以及其他