WPF之认识XAML

  • A+
所属分类:.NET技术
摘要

在Visual Studio 2019中使用WPF项目模板建立一个最简单的WPF项目,如下图所示:

可以看到,项目里面主要有两个分支:

新建项目

在Visual Studio 2019中使用WPF项目模板建立一个最简单的WPF项目,如下图所示:
WPF之认识XAML
可以看到,项目里面主要有两个分支:

  • App.xaml分支:程序的主体,声明了程序的进程会是谁,同时指定了程序的主窗体是谁,分支里的App.xaml.cs是App.xaml的后台代码。
  • MainWindow.xaml分支:程序的主窗体,具有自己的后台代码Windowl.xaml.cs,默认两个文件。
    在Windows系统里一个程序就是一个进程(Proces),一个GUl进程需要有一个窗体(Window)作为“主窗体”。
    接下来我们重点分析MainWindow.xaml和它的后台代码。

剖析XAML代码

在MainWindow.xaml里能看到如下代码:

<Window x:Class="LearnWpf.MainWindow"         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"         xmlns:local="clr-namespace:LearnWpf"         mc:Ignorable="d"         Title="MainWindow" Height="450" Width="800">     <Grid>              </Grid> </Window> 

XAML是一种由XML派生而来的语言,很多XML中的概念在XAML是通用的,如:

  • 使用标签声明一个元素(每个元素对应内存中的一个对象)时需要使用起始标签<Tag>终止标签</Tag>
  • 夹在起始标签和终止标签中的XAML代码表示是隶属于这个标签的内容
  • 如果没有什么内容隶属于某个标签,则这个标签称为空标签,可以写为<Tag/>

为了表示同类标签中的某个标签与众不同,可以给它的特征(Attribute)赋值,为特征赋值的语法如下:

  • 非空标签:<Tag Attributel=Valuel Attribute2=Value2>Content
  • 空标签:<Tag Attributel=Valuel Attribute2=Value2/>

为了表示同类标签中的某个标签与众不同,可以给它的特征(Atribute)赋值。为特征赋值的语法如下:
·非空标签:<Tag Aributel=Valuel Attribute2-Value2>Content
·空标签:<Tag Attributel=Valuel Attribute2=Value2>

注意Attribute(特性)Property(属性)的区别,Attribute和Property是两个层面上的东西:

  • Attribute则是编程语言文法层面的东西,只与语言层面上的东西相关
  • Property属于面向对象理论范畴,是针对对象而言的
  • XAML中把标签的Attribute与对象的Property做了一个映射,但也不是完全映射的,比如,x:Class特性

MainWindow.xaml的总体结构是一个标签内部包含着一个标签(或者说标签是标签的内容,如下代码段所示),代表的含义是一个窗体对象内嵌套着一个Grid对象:

<Window>     <Grid>              </Grid> </Window> 

<Window>标签的Attribute如下所示:

x:Class="LearnWpf.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:LearnWpf" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800" 
  • 最上面一行是在使用名为Class的Aturibute,这个Attribute来自于x:前缀所对应的名称空间,x:Class特性告诉XAML编译器将编译结果和哪个C#编译的类合并
  • 中间五行是在声明名称空间,xmlns也就是XML-Namespace的缩写,xmlns后可以跟一个可选的映射前缀并用冒号分隔
  • mc:Ignorable命名空间提供了xaml处理器“忽略”的xaml定义,允许您指定设计者在设计时使用的信息(在运行时被忽略),如d:DesignHeight="725" d:DesignWidth="1015"
  • Title、Height和Width是与Window对象的Property相对应的

如果没有写可选映射前缀,那就意味着所有来自于这个名称空间的标签前都不用加前缀,这个没有映射前缀的名称空间称为“默认名称空间”——默认名称空间只能有一个,而且应该选择其中元素被最频繁使用的名称空间来充当默认名称空间。

上面看上去像网页地址的名称空间是XAML解析器的一个硬性编码(hard-coding),只要见到这些固定的字符串就会把一系列必要的程序集(Assembly)和程序集中包含的.NET名称空间引用进来。在XAML中引用外来程序集和其中.NET名称空间与C#的语法不同,需要在根元素的起始标签中声明命名空间,如:xmlns:c="clr-namespace:System.Windows.Controls;assembly=PresentationFramework",c是映射前缀(可换成其他的字符串,如control),其中的命名空间、程序集根据实际情况确定。硬性编码可以看成批量的程序集和程序集中包含的.NET名称空间引用,它们共用一个命名空间前缀。

参考资料

深入浅出WPF-从零起步认识XAML 网盘提取码:5w20
WPF学习之X名称空间详解
c# – 什么意思mc:Ignorable =“d”在WPF?