初识XAML

本文介绍了XAML,一种用于WPF设计UI的可扩展应用程序标记语言,讲解了其起源、组成部分(如Properties、References、App.xaml和Window.xaml)以及基本的标签结构和属性映射。重点剖析了XAML的语法和XML概念在其中的应用,包括命名空间和类型引用的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Q:XAML是什么?
A:XAML是一种编程语言,全称是xtensible Application Markup Language,即可扩展应用程序标记语言。在WPF中,专门用于设计UI的语言。它是由XML派生来的。既然是一种语言,就需要学习它的语法,即规则、特性。

一个简单的WPF程序包含以下四个部分:
在这里插入图片描述
● Properties分支:里面的主要内容是程序要用到的一些资源(如图标、图片、静态的字符串)和配置信息。
● References分支:标记了当前这个项目需要引用哪些其他的项目。目前里面列出来的条目都是.NET Framework中的类库,有时候还要添加其他.NET Framework类库或其他程序员编写的项目及类库。
● App.xaml分支:程序的主体。大家知道,在Windows系统里,一个程序就是一个进程(Process)。Windows还规定,一个GUI进程需要有一个窗体(Window)作为“主窗体”。App.xaml文件的作用就是声明了程序的进程会是谁,同时指定了程序的主窗体是谁。在这个分支里还有一个文件——App.xaml.cs,它是App.xaml的后台代码。
在这里插入图片描述
从App.xaml中可以看出,程序将一个名为“MainWindow”的窗体,作为主窗体。这个窗体是由名为“MainWindow”的xaml文件解析编译生成的,书后面有介绍。
● Window1.xaml分支:程序的主窗体

剖析最简单的XAML代码

在这里插入图片描述
XAML是一种由XML派生而来的语言,所以很多XML中的概念在XAML是通用的。比如,使用标签声明一个元素(每个元素对应内存中的一个对象)时,需要使用起始标签和终止标签,夹在起始标签和终止标签中的XAML代码表示是隶属于这个标签的内容。如果没有什么内容隶属于某个标签,则这个标签称为空标签,可以写为。
为了表示同类标签中的某个标签与众不同,可以给它的特征(Attribute)赋值。为特征赋值的语法如下:
● 非空标签:Content
● 空标签:
XAML是一种“声明”式语言,当你见到一个标签,就意味着声明了一个对象,对象之间的层级关系要么是并列、要么是包含,全都体现在标签的关系上。
XAML中的Attribute(特征)与类中的Property(属性):Property属于面向对象理论范畴。Attribute则是编程语言文法层面的东西。详细可参考书P9。
实际上,使用能够进行面向对象编程的标签式语言只是把标签与对象做了一个映射,同时把标签的Attribute与对象的Property也做了一个映射——针对标签还是叫Attribute,针对对象还是叫Property,仍然不是一个层面上的东西。而且,标签的Attribute与对象的Property也不是完全映射的,往往是一个标签所具有的Attribute多于它所代表的对象的Property。
因为XAML是用来在UI上绘制控件的,而控件本身就是面向对象抽象的产物,所以XAML标签的Attribute里就有一大部分是与控件对象的Property互相对应的。当然,这还意味着XAML标签还有一些Attribute并不对应控件对象的Property。
明白了XAML的格式以及Attribute与Property的关系,对上面的代码即可一目了然。它的总体结构是一个标签内部包含着一个标签(或者说标签是标签的内容,如下代码段所示),代表的含义是一个窗体对象内嵌套着一个Grid对象。
在这里插入图片描述
下面这些代码就都是标签的Attribute。其中,Title、Height和Width一看就知道是与Window对象的Property相对应的。中间两行(即两个xmlns)是在声明名称空间。最上面一行是在使用名为Class的Attribute,这个Attribute来自于x:前缀所对应的名称空间。
在这里插入图片描述
xmlns特征的语法格式如下:
在这里插入图片描述

xmlns后可以跟一个可选的映射前缀,之间用冒号分隔。如果没有写可选映射前缀,那就意味着所有来自于这个名称空间的标签前都不用加前缀,这个没有映射前缀的名称空间称为“默认名称空间”——默认名称空间只能有一个,而且应该选择其中元素被最频繁使用的名称空间来充当默认名称空间。上面的例子中,和都来自由第二行声明的默认名称空间。而第一行中的Class特征则来自于第三行中x:前缀对应的名称空间。这里可以做一个有趣的小实验:如果给第二行声明的名称空间加上一个前缀,比如n,那么代码就必须改成这样才能编译通过:
在这里插入图片描述
XAML中引用外来程序集和其中.NET名称空间的语法与C#是不一样的。在C#中,如果想使用System.Windows.Controls名称空间里的Button类,需要先把包含System.Windows.Controls名称空间的程序集PresentationFramework.dll通过添加引用的方式引用到项目中,然后再在C#代码的顶部写上一句using System.Windows.Controls;。在XAML中做同样的事情也需要先添加对程序集的引用,然后再在根元素的起始标签中写上一句:xmlns:c=“clr-namespace:System.Windows.Controls;assembly=PresentationFramework”。c是映射前缀,换成其他的字符串(如control)也可以。因为Button来自前缀c对应的名称空间,所以在使用Button的时候就要写成<c:Button>…</c:Button>。
xmlns:c=“clr-namespace:System.Windows.Controls;assembly=PresentationFramework”,这么长的一串字符看上去的确有点恐怖,但不用担心,VS 2008是有自动提示功能的,如图2-5所示。
在这里插入图片描述在VS 2008自动提示的顶部,你会看到几个看上去像网页地址的名称空间,如图2-6所示,其中就包含例子代码中的那两行。为什么名称空间看上去像是一个主页地址呢?其实把它copy到IE的地址栏里尝试跳转也不会打开网页。这里只是XAML解析器的一个硬性编码(hard-coding),只要见到这些固定的字符串,就会把一系列必要的程序集(Assembly)和程序集中包含的.NET名称空间引用进来。
在这里插入图片描述
默认引用进来的两个名称空间格外重要,它们所对应的程序集和.NET名称空间如下:
http://schemas.microsoft.com/winfx/2006/xaml/presentation对应:
● System.Windows
● System.Windows.Automation
● System.Windows.Controls
● System.Windows.Controls.Primitives
● System.Windows.Data
● System.Windows.Documents
● System.Windows.Forms.Integration
● System.Windows.Ink
● System.Windows.Input
● System.Windows.Media
● System.Windows.Media.Animation
● System.Windows.Media.Effects
● System.Windows.Media.Imaging
● System.Windows.Media.Media3D
● System.Windows.Media.TextFormatting
● System.Windows.Navigation
● System.Windows.Shapes
也就是说,你在XAML代码中可以直接使用这些CLR名称空间中的类型(因为默认XML名称空间没有前缀)。
http://schemas.microsoft.com/winfx/2006/xaml则对应一些与XAML语法和编译相关的CLR名称空间。使用这些名称空间中的类型时需要加x前缀,因为它们被映射到了名为x的XML名称空间中(后面章节中有详细叙述)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值