随着技术的不断发展,使用者对应用程序的界面体验提出了更高的要求,为了应对越来越复杂的界面设计需求和有效的简化界面开发过程,微软公司在其应用程序的开发技术当中引入一套新的应用程序界面描述语言,这就是XAML。

XAML是eXtensible Application Markup Language的英文缩写,相应的中文名称为可扩展应用程序标记语言。与很多读者所熟知的HTML相似,XAML的作用同样也是用来对应用程序的界面进行描述的,并且相比提供了丰富的界面元素和便于定位扩展的语法。

本章将从XAML基础说起,重点介绍适用于开发Windows应用商店应用所使用的XAML语法,读者通过对本章的学习可以为后面要讲解的内容打好基础。

3.1 XAML的起源

在实际开发工作中,设计者和开发者一般都会使用两种不同的软件工具来完成应用程序的界面设计和代码编写,由于传统应用程序的界面布局和逻辑代码是集成在一起的,因此对于开发传统应用程序而言,开发人员往往是通过参考设计人员给出的界面示意图和说明文档对应用程序的界面进行开发,而无法完全让设计人员也参与到软件开发中来,这往往会使开发出来的应用界面与实际设计之间产生一定的偏差。如果在开发过程中反复修改应用界面,会降低开发人员的工作效率,并对项目进度产生影响。

为解决这一问题,微软在其应用程序开发技术中引入了XAML,使用XAML对应用程序的界面进行描述,可以将应用程序开发中的界面设计和逻辑代码独立分开。设计人员在使用熟悉的软件工具对应用程序界面进行设计的同时,软件工具会实时地将所设计的应用界面用XAML描述出来。这样在设计人员完成对应用界面的设计之后,可以把应用界面所对应的XAML代码交给开发人员应用到项目开发当中,同样,开发人员对XAML所做的更改也会反映在设计人员所熟悉的设计界面当中,从而去除了细节上的反复沟通,减少了错误的产生。

3.2 XAML基础知识

由于XAML是基于XML(可扩展标记语言)的语法规则定义而来的,其本身就是一个组织良好的XML文档,因此XAML文档的内部组成结构与XML非常相似,包括元素的定义格式和属性的设置等。另外,XAML也具有广泛的可扩展性,允许开发人员创建自定义控件、事件和方法等。

在本节中,我们将介绍XAML语言中的一些基础知识,首先是一个完整的XAML文件的组成部分,包括命名空间的声明、元素的定义、元素的属性设置、用于属性赋值时的标记扩展和数据类型转换器;然后介绍XAML中的资源字典,包括资源字典的分类以及如何进行资源的引用、重用和合并;最后将对XAML中的事件以及依赖项属性和附加属性进行讲解。

3.2.1 命名空间

XAML中的命名空间(NameSpace)和C#代码中的using及VB.Net代码中的Imports作用相似,当在XAML文件中定义元素时,需要使用命名空间提前对元素的类库进行引用声明。

通过在Page元素的开始标签中加入"xmlns:命名空间前缀"格式的属性并赋值上一个URI来声明一个命名空间,其中命名空间前缀规定了XAML文件中定义的元素或元素的属性应该包含在相应的命名空间内,URI表示唯一标识符。例如,在Page元素中声明一个前缀为x、URI为"http://schemas.microsoft.com/winfx/2006/XAML"的命名空间,代码如下所示:

<Page xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

</Page>

在声明整个XAML文档的默认命名空间时,可以不加命名空间前缀。如下例所示:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/XAML/presentation">

</Page>

这样,XAML文件中那些没有前缀的元素或属性都属于默认命名空间。

需要注意的是,命名空间的声明要放在XAML文件的Page元素中,而且一个命名空间的前缀名不要与其他的命名空间前缀重名。

3.2.2 元素定义

在XAML中,一个元素被看做是一个对象。根据XAML语法,可以通过如下方法来定义元素。

(1)直接定义

一个起始标签和一个结束标签:<元素名>…</元素名>。这种定义元素的方式是以标签<元素名>开始,以标签</元素名>结束,开始标签和结束标签之间的XAML代码表示这个元素的内容。例如,定义一个Button元素,对应的XAML代码如下所示:

<Button>...</Button>

其中,"<Button>"是开始标签,"</Button>"是结束标签,Button是元素名称,省略部分表示Button元素的内容。

此外,如果元素不包含其他内容,就可以使用一个自结束标签来定义该元素,其语法格式如下所示:

<元素名 />

(2)使用属性元素方式定义元素

有些元素的属性值并不是基础元素,可以通过定义属性元素来设置属性的值,其语法格式如下所示:

<元素名>

<元素名.属性名>

...

</元素名.属性名>

</元素名>

例如,要向Canvas画布中添加一个矩形并填充成蓝色背景,那么就可以将矩形的Fill属性定义成Rectangle.Fill元素来设置这个矩形,对应的XAML代码片段如下所示:

<Canvas>

<Rectangle>

<Rectangle.Fill>

<SolidColorBrush Color="Blue"/>

</Rectangle.Fill>

</Rectangle>

</Canvas>

这里使用SolidColorBrush(纯色画刷)来初始化Fill属性,并且将画刷的颜色设置为蓝色。

需要注意的是,XAML中元素和属性的名称是区分大小写的。例如,如果将TextBox写成textbox,XAML语法解析器将提示错误信息"Windows应用程序项目中不支持textbox"。

Win10系列:UWP界面布局基础1的更多相关文章

  1. Win10系列:UWP界面布局基础8

    路由事件 XAML不仅继承了传统的事件处理方式,还引入了一个增强型事件处理机制:路由事件(RoutedEvent).路由事件和传统事件的不同是:路由事件允许一个对象触发事件后,可以同时拥有多个事件接收 ...

  2. Win10系列:UWP界面布局基础7

    2.附加属性 有一些XAML元素,其自身的属性大多是在其它的元素中声明和使用的,该元素本身却很少使用,这些在其他元素中声明和使用的属性被称为附加属性(Attached Properties).附加属性 ...

  3. Win10系列:UWP界面布局基础4

    类型转换 前面讲到过,在定义元素时可以通过Attributes特性方式为其设置属性并为属性赋值,在实际开发中所赋予的值可能和属性本身的数据类型不相符,这时XAML解析器就会使用类型转换器(Type C ...

  4. Win10系列:UWP界面布局基础2

    属性设置 在面向对象程序开发中,所提及的属性通常指的是对象的属性.在XAML代码中,定义元素时也可以为其设置属性,例如对于一个TextBox元素,有背景属性.宽度属性和高度属性等.为了满足实际应用的需 ...

  5. Win10系列:UWP界面布局基础12

    画刷 画刷(Brush)用于为图形元素填充颜色.在XAML中,画刷有许多属性,其中较常使用的是Fill属性和Stroke属性,Fill用于填充图形的背景色,而Stroke用于设置图形的线条颜色. 在实 ...

  6. Win10系列:UWP界面布局基础11

    样式继承 为了使样式便于维护及重复使用,可以在一个样式上引用其他的样式,这就是样式继承.样式继承的方法是:在Style元素的BasedOn属性上使用StaticResource标记扩展来引用被继承的样 ...

  7. Win10系列:UWP界面布局基础5

    (2)编写后台代码访问资源 下面通过一个例子来演示如何编写后台代码引用资源.新建一个Windows应用商店的空白应用程序项目,将其命名为AccessResourceApplication,打开项目下的 ...

  8. Win10系列:UWP界面布局基础3

    在实际项目开发中,为控件属性赋值时经常会遇到属性值在设计时处于未知状态,而只有在应用程序运行时才能获取到.这种情况下,直接赋值方法是无法满足的,可以使用XAML标记扩展(Markup Extensio ...

  9. Win10系列:UWP界面布局基础9

    在XAML中,样式.模板.画笔和动画等都被看做是资源,它们最终的作用都是相同的,就是让设计人员可以使用这些资源创建更好的视觉效果,对其设计的产品外观进行标准化统一,那么如何使用这些资源并组织和重用呢, ...

随机推荐

  1. [转][linux]简单的linux下的tcp/udp

    转自:https://blog.csdn.net/cabing2005/article/details/53068880 详细函数以及参数解释请看原链接. windows下的tcp/udp参考:htt ...

  2. Windows下pipenv将虚环境文件的位置设置在项目根目录下

    在windows下使用pipenv shell时,虚拟环境文件夹会在C:\Users\Administrator\.virtualenvs\目录下默认创建,为了方便管理,将这个虚环境的文件的位置更改一 ...

  3. 《剑指offer》第五十题(字符流中第一个只出现一次的字符)

    // 面试题50(二):字符流中第一个只出现一次的字符 // 题目:请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从 // 字符流中只读出前两个字符"go"时,第一 ...

  4. Rest数据服务查询类-根据sql查询

    Rest数据服务查询类 需要iserver data服务支持,但请求的时候,不依赖SuperMap js lib包. 构造函数:QueryById=function(p_params): p_para ...

  5. SQL service 中的 ”输入SQL命令窗口“ 打开了 “属性界面” 回到 ”输入SQL命令窗口“

    输入SQL命令窗口点击上面的菜单栏中的 “窗口”

  6. Python Selenium Cookie 绕过验证码实现登录

    Python Selenium Cookie 绕过验证码实现登录 之前介绍过博客园的通过cookie 绕过验证码实现登录的方法.这里并不多余,会增加分析和另外一种方法实现登录. 1.思路介绍 1.1. ...

  7. English trip EM2-PE-6A Family Relationship Teacher:Taylor

    课上内容(Lesson) What's your name? Where is your hometown?  你的家乡是哪里? Where do you come from?    你从哪里来?  ...

  8. English trip V1 - 22. My Life Teacher:Emily Key: describe talk about past 过去式

    In this lesson you will learn to talk about the past. 课上内容(Lesson) I was born in 1986. I started sch ...

  9. c#万能视频播放器

    http://blog.csdn.net/yanzhibo/article/details/8972822 本人之前很多的文章中均提到了使用libvlc为播放器内核制作的播放器,也许有些朋友对此感兴趣 ...

  10. python3-----多进程、多线程、多协程

    目前计算机程序一般会遇到两类I/O:硬盘I/O和网络I/O.我就针对网络I/O的场景分析下python3下进程.线程.协程效率的对比.进程采用multiprocessing.Pool进程池,线程是自己 ...