XAML学习笔记

     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值自动在代码隐藏类中添加方法;
 





原文地址:https://www.cnblogs.com/lvniao/p/3560200.html