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. java读取properties文件的内容

    获得properties文件中某个key对应着的value // 路径名称 + properties的名称,不要“properties” private static final String BUN ...

  2. C#写入登陆Cookies

    protected void Page_Load(object sender, EventArgs e) { //打开登录页面时获取客户端cookie值并写入前台控件中 HttpCookie cook ...

  3. Eclipse中添加web dynamic project

    因为我的eclipse版本是kepler service release 2,所以我用了这个链接,http://download.eclipse.org/releases/helios/ 参考链接:  ...

  4. WinForm窗体拖动代码

    本文转载自:http://www.cnblogs.com/ap0606122/archive/2012/10/23/2734964.html using System; using System.Co ...

  5. php定时执行脚本

    php定时执行脚本 ignore_user_abort(); // run script. in background set_time_limit(0); // run script. foreve ...

  6. <limits.h>和<float.h>

    头文件<limits.h>中定义了用于表示整类型大小的常量.以下所列的值是可接受的最小值,实际系统中可能有更大的值. CHAR_BIT char类型的位数 CHAR_MAX UCHAR_M ...

  7. cowboy使用restful的例子

    直接贴代码,一切尽在不言中 %% cowboy的restful的文档,一定要好好阅读http://ninenines.eu/docs/en/cowboy/HEAD/manual/cowboy_rest ...

  8. activiti自定义流程之自定义表单(一):环境配置

    先补充说一下自定义流程整个的思路,自定义流程的目的就是为了让一套代码解决多种业务流程,比如请假单.报销单.采购单.协作单等等,用户自己来设计流程图. 这里要涉及到这样几个基本问题,一是不同的业务需求, ...

  9. flash builder 启动ios模拟器失败是什么原因?

    参考知乎:http://www.zhihu.com/question/22537362 在mac os设置-安全性与隐私-隐私-辅助功能 找到flash bulder 打上前面的勾,如下图:

  10. C#动态调用C++编写的DLL函数

    C#动态调用C++编写的DLL函数 动态加载DLL需要使用Windows API函数:LoadLibrary.GetProcAddress以及FreeLibrary.我们可以使用DllImport在C ...