XAML是用于实例化.NET对象的标记语言,主要用于构造WPF界面。不同于WPF之前的Windows编程技术(WinForm,MFC及win32sdk),在WPF之中界面主要是在XAML中添加界面对象所对应的标记以声明式来完成的,而且XAML充分做到了将界面与业务逻辑分开,这样界面设计人员只需实现需求所要求的界面,而开发人员利用WPF丰富的事件完成相关的业务逻辑。
     WPF的程序不能离开部分类的概念,XAML中虽然是一种XML变种形式构成的,但实际上是一个部分类,并与XAML对应的cs文件中的类构成一个完整的类。WPF程序在编译时会将XAML编译为BAML,并将编译后的BAML作为资源嵌入程序集中,当然这些都是由编译器自动完成的。
    下面简单说说XAML的语法规则:
    1) XAML文档中的每个元素对应.NET类的一个类,且元素名称与类名相同,例如:<Button>对应System.Windows.Controls.Button。而元素的属性则对应类的属性;
    2)同XML一样,在XAML中一个元素中可以嵌套另一个元素。但具体的解释方式不同,不如Button是个内容控件,嵌套在其内部的对象实际上是赋给了Button对象的Content属性;而像Grid,因为Grid是布局,所以嵌套在其内部的元素都被添加到Grid的Children集合中;
    下面以一个具体的例子来进行说明:
1  <Window x:Class="WindowsApplication1.Window1"
2    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4    Title="Window1" Height="300" Width="300">
5    <Grid Name="gridMainLayout">
6    </Grid>
7  </Window>
 
1. 最外层的元素是个顶级元素,一个XAML文档只可以有一个顶级元素,而且顶级元素必须是Window、Page或Application类或其派生类;
2. 第四行中Height="300" Width="300",表示窗口大小为300*300单位。因为WPF为了不因本地分辨率而影响显示效果,所以采用相对度量系统,基本单位为1/96英寸而不是像素;
3. 同cs中的类一样,在XAML中也要引入对应的名称空间。上面示例的第2行是WPF核心名称空间(包含所有WPF类,包括用于构建用户界面的控件),第3行是XAML名称空间(包含各种XAML实用特性);
4. 第3行的xmlns:x相当于XAML名称空间别名,后面欲使用XAML名称空间中的类时语法为x:XXX。而第2行没有后缀标志WPF核心名称空间为默认名称空间。这两个是每个XAML文件中都会有的,属于固定写法;
5. 当要在XAML中引入类外资源时要先引入名称空间,语法为:xmlns:gui="clr-namespace:Das.Main.Gui;assembly=Das.Main.Gui",clr-namespace表示要导入的名称空间为Das.Main.Gui;assembly表示要引用的程序集;
6. x:Class="WindowsApplication1.Window1"表示该XAML对应的代码隐藏类,在这个类中实现相关的业务逻辑,形式如下:
1  namespace WindowsApplication1
2  {
3    public partial class Window1 : Window
4    {
5      public Window1()
6      {
7        InitializeComponent();
8      }
9    }
10  };
7. InitializeComponent方法中调用System.Windows.Application类的LoadComponent方法从程序集中提取BAML,并使它构建用户界面,在解析BAML时创建每个控件对象并设置属性和关联所有事件处理程序;
8. 如果要在代码隐藏类中操作XAML中的控件,则使用Name属性为控件提供名称,编译BAML后Name的值会成为该控件的引用变量名
9. 形如Name="gridMainLayout"这样的为简单属性,属性的值都为字符串,在编译BAML中会调用对应的转换器,将字符串值转换为对应类型的值;
10. 形如:
  <Grid Name="gridMainLayout">
    <Grid.ColumnDefinitions>
      <ColumnDefinition/>
    </Grid.ColumnDefinitions>
  </Grid>
中的ColumnDefinitions属性这样的为复杂属性。因为这些对象的值一般为另一个对象而不是一个字符串,所以就要通过嵌套元素的方式来给复杂属性赋值。当然可以通过嵌套元素的方式为任何属性赋值;
11. 为实现非硬编码属性值或将属性值设置为其他对象,或将属性绑定到另一个控件来动态设置属性值,可采用标记扩展语法完成,例如:
<Button ... Background="{x:Static SystemColors.RedBrush}"/>。即{标记扩展类 参数};
12. 附加属性:容器中的控件会根据容器的类型而获得额外的特征,这些附加的特征即附加属性,最常见在Grid内的元素中定义该元素在Grid中的位置;
13. 属性值中难免会有<、>、&或",所以XAML提供了对应的转义字符,对应为&lt、&gt、&amp及&quot;
14 在XAML中可以给对象的事件添加处理方法,比如:
<Button ... Click="cmdAnswer_Click"/>
这样就给Button的Click事件添加了处理方法,在VS中在输入Click=后,按Tab键会根据Button的Name值自动在代码隐藏类中添加方法;
 

XAML学习笔记的更多相关文章

  1. WPF学习笔记-用Expression Design制作矢量图然后导出为XAML

    WPF学习笔记-用Expression Design制作矢量图然后导出为XAML 第一次用Windows live writer写东西,感觉不错,哈哈~~ 1.在白纸上完全凭感觉,想象来画图难度很大, ...

  2. Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

    Caliburn.Micro学习笔记目录 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详 ...

  3. Caliburn.Micro学习笔记(二)----Actions

    Caliburn.Micro学习笔记目录 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions, ...

  4. Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>

    Caliburn.Micro学习笔记目录 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现 ...

  5. Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能

    Caliburn.Micro学习笔记目录 说一下IHandle<T>实现多语言功能 因为Caliburn.Micro是基于MvvM的UI与codebehind分离, binding可以是双 ...

  6. Caliburn.Micro学习笔记(五)----协同IResult

    Caliburn.Micro学习笔记目录 今天说一下协同IResult 看一下IResult接口 /// <summary> /// Allows custom code to execu ...

  7. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  8. Dynamic CRM 2013学习笔记(四十三)流程6 - 自定义流程活动

    当我们在流程里添加步骤时,有一些默认的步骤,像创建.更新.发邮件等,但如果你想加一个里面没有的步骤,比如发SMS消息,或者调用一个外部的web service,怎么办?这时就只能自定义一个流程活动了. ...

  9. Windows phone 8 学习笔记(5) 图块与通知(转)

    基于metro风格的Windows phone 8 应用提到了图块的概念,它就是指启动菜单中的快速启动图标.一般一个应用必须有一个默认图块,还可以有若干个次要图块.另外,通知与图块的关系比较密切,我们 ...

随机推荐

  1. 如何创建自己的docker image并上传到DockerHub上

    这里,记录一下比较常用的docker操作细节,对于初次使用者,可能有很大的帮助. docker作为云计算Paas层面的东西,风靡全世界了,主要是因为它小巧,好用,功能强大.今天主要介绍一下如何依据自己 ...

  2. jQuery实现登录提示

    实现效果:将鼠标聚焦到邮箱地址文本框时,文本框 内的"请输入邮箱地址"文字将被清除:   若没有输入任何内容,鼠标移除后邮箱地址文本框被还原. <!DOCTYPE html& ...

  3. 51nod1258 序列求和V4

    T(n) = n^k,S(n) = T(1) + T(2) + ...... T(n).给出n和k,求S(n).   例如k = 2,n = 5,S(n) = 1^2 + 2^2 + 3^2 + 4^ ...

  4. 51nod 1150 Logarithm

    题目来源: Ural 1318 给出n个互不相等的整数A[0] - A[n-1],选A[i]同A[j]进行异或运算(结果都 > 0无符号),对结果取lg(以10为底)并取整后记为L[i,j],求 ...

  5. nodejs小问题:express不是内部或外部命令

    来源:http://jingyan.baidu.com/article/922554468a3466851648f419.html 一时兴起想学习点东西,准备在heroku上部署一个Node.js的小 ...

  6. SQL Server附加数据库文件出错

    场景: 新装一台数据库服务器,装好后,附加数据库时出错.附加前的数据库架构没有在新服务器上安装.新服务器上只有默认dbo架构. 解决: 以windows身份验证登录,附加正常. 错误码可能为5120. ...

  7. oracle imp导入数据到另一个表空间

    http://blog.163.com/darlingchenlin@126/blog/static/7156283420100531431855/ 1.在第一个数据库导出数据:qlyg_xs_db_ ...

  8. JavaScript-CheckBox全选/反选

    //------------------------------------ // 全/反选 // param checkName checkbox的name属性 //---------------- ...

  9. [运维-服务器 – 2A] – nginx下绑定域名

    这个篇文章今天(2016-01-21)才有幸写了,因为自己对nginx部署以前没玩过,还得感谢下我们数字化的总经理.在这里记录下自己成长的经验,与遇到的问题. 因为自己的域名是在万网上买的,解析无法直 ...

  10. Form_Form Builder Export导出为Excel(案例)

    2014-01-09 Created By BaoXinjian