XAML是什么

对于以往桌面程序开发来说,需求分析结束后,UI设计师完成效果图,再由程序员通过编程实现,两者是“串行”的关系,但是再优秀的团队也会在沟通和整合上消耗巨大精力,比如设计师的设计跟不上逻辑的变化、程序员未能完全实现设计的UI效果图等。如果UI设计师能与程序员“并行”工作的话,那么上面提到的问题就得以解决。因此,微软创造了一种新的开发语言——XAML,这种语言借鉴了网络开发模式(即设计师使用HTML、CSS、JavaScript直接生成UI,程序员则在UI产生的同时实现背后的功能逻辑)。XAML全称是可扩展应用程序标记语言(Extensible Application Markup Language),它成为了设计师与程序员之间沟通的枢纽,设计师使用Blend来设计静态UI和动画,程序员使用Visual Studio开发后台逻辑代码,其中特别重要的是,这些设计出的静态UI和动画会以XAML的形式保存进项目,无需转化就可以直接编译。

XAML的优点

  • XAML可以设计出专业的UI和动画——好用
  • XAML不需要专业的编程知识,它简单易懂、结构清晰——易学
  • XAML使设计师能直接参与软件开发,随时沟通、无需二次转化——高效
  • XAML真正实现了UI与逻辑的剥离——降低耦合度

XAML是一种声明语言,它只能用来声明一些UI元素、绘制UI和动画(在XAML里实现动画是不需要编程的),根本无法在其中加入程序逻辑,这就强制地把逻辑代码和UI代码分开,与UI相关的元素全部集中在表示层、与逻辑相关的代码全部集中在逻辑层,形成了高内聚低耦合的结构,提高了程序的可维护性。

XAML代码简单解析

上面介绍了什么是XAML以及优点,接下来让我们通过简单示例更直观的认识一下XAML。
首先,在Visual Studio 2019中选择WPF应用(.NET Framework)项目模板来新建一个WPF项目:


现在我们已经新建了一个WPF的项目,在Solution Explorer窗口中我们看到,WPF应用项目模板为我们准备了一系列源代码:

  • Properties分支:主要是程序用到的一些资源和配置文件
  • References分支:标记了当前项目需要引用的其他项目,比如.NET Framework中的类库、其他程序员编写的项目和类库。
  • App.xaml:这个文件的作用就是声明了程序的进程会是谁,同时指定了程序的主窗体是谁。在这个分支里还有一个文件——App.xaml.cs,它是App.xaml的后台代码
  • Window1.xaml分支:程序的主窗体,同样具有自己的后台代码Window1.xaml.cs。

对于XAML文件,VS2019提供了可视化编辑能力,你可以切换XAML代码和预览视图,也可以将两者同时展示,如下图:

下面我们开始重点分析一下Window1.xaml文件和它的后台代码,在Window1.xaml代码中可以看到:

<Window x:Class="WpfApp1.Window1"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Window1" Height="300" Width="300"><Grid></Grid>
</Window>

看到这段代码的第一感觉就是里面有很多标签,其中还有两个很像主页地址的东西。。。XAML是一种XML派生而来的语言,所有很多XML中的概念在XAML是通用的,比如使用标签声明一个元素(每个元素对应内存中的一个对象),需要使用起始标签和终止标签,夹在起始标签和终止标签中的XAML代码表示是隶属于这个标签的内容,如果没有内容,则这个标签称为空标签:

  • 非空标签:<标签名 Attribute1=Value1 Attribute2=Value2>Content</标签名>
  • 空标签:<标签名 Attribute1=Value1 Attribute2=Value2/>

这里提到了Attribute,因为大多数中文翻译都将Attribute译为“属性”,而Property也被译为“属性”,关于两者如何辨别区分,将会在后续的博文中单独说明,此处略过。

因为XAML是用来绘制UI控件的,而控件本身就是面向对象的产物,所以XAML标签的Attribute里有一大部分是与控件对象的Property互相对应,还有一些Attribute并不对应控件对象的Property。XAML是一种声明式语言,一个标签就意味着声明了一个对象,对象之间的层级关系要么包含、要么并列,全都提现在标签的关系上,上面代码的总体结构就是一个Window标签内部包含一个Grid标签(也可以说Grid标签是Window标签的内容),代表的含义就是一个窗体对象内嵌套着一个Grid对象,对于Window标签来说,其中的Title、Height、Width这些Attribute(相对于标签叫Attribute,相对于对象叫Property)与Window对象的Property相对应,两个xmlns是声明名称空间,x:Class=“WpfApp1.Window1”是使用名为Class的Attribute,这个Attribute来自于x:前缀所对应的名称空间,xmlns特征的语法格式如下:

xmlns[:可选的映射前缀]="名称空间"

xmlns后可以跟一个可选的映射前缀,之间用冒号分隔,如果没有写可选映射前缀,那就意味着所有来自于这个名称空间的标签前都不用加前缀,这个没有映射前缀的名称空间称为“默认名称空间”——默认名称空间只能有一个,所以一般选择其中元素被最频繁使用的名称空间来充当默认名称空间。我们改一下上面代码,将xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"改为xmlns:n=“http://schemas.microsoft.com/winfx/2006/xaml/presentation”,则整体代码需要改成如下格式才能编译通过:

<n:Window x:Class="WpfApp1.Window1"xmlns:n="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Window1" Height="300" Width="300"><n:Grid></n:Grid>
</n:Window>

XAML中引用外来程序集和.NET名称空间的语法时,需要先添加对程序集的引用,然后再在根元素的起始标签中写上xmlns:可选前缀=""这样一句话,这些看上去像主页地址的字符串只是XAML解析器的一个硬性编码,VS2019有自动提示功能,所以不用担心。
最后来说一下x:Class这个Attribute,来自于x映射的名称空间是对应XAML的解析功能的,x:Class的作用是当XAML解析器将包含它的标签解析成C#类后,这个类的类名是什么,我们可以看到Window1.xaml.cs中Window1类的声明时使用了partial关键字,这个关键字可以把一个类拆分在多处定义,只要各部分代码不冲突即可,XAML解析成的类也具有partial这个关键字,所以XAML解析成的类和C#文件里定义的部分就合二为一了。正因为partial这种机制,我们可以把类的逻辑代码留在.cs文件里,用C#语言来实现,把那些与声明及布局UI元素相关的代码分离出去,用XAML语言编写,从而实现UI与逻辑分离。

总结

至此,我们对XAML语言有了一定了解,下一篇我们将学习XAML的语法及编程知识!

设计UI的语言——XAML相关推荐

  1. GUI Guider设计UI界面移植到STM32

    GUI Guider设计UI界面移植到STM32 一.什么是GUI Guider 什么是 GUI-Guider? GUI Guider 是恩智浦为 LVGL 开发了一个上位机GUI 设计工具,可以通过 ...

  2. 求最大公约数的设计与C语言实现

    求最大公约数是一常见的数学问题,数学思维中的常用求法有指数分解.短除法.辗转相除和更相减损法,其中前两个算法通过代码实现的效率是非常低的,我能想到的方法只有首先就需要一个求质数算法的表达式来表示无穷大 ...

  3. c语言链表p-%3enext,课程设计报告.c语言程序设计.pdf

    课程设计报告.c语言程序设计 学生成绩管理 C语言课程设计报告 学 院 _信息学院_ 专 业 软件工程 班 级 _ _ 学 号 姓 名 课 题 _C语言课程设计_ 指导教师 __ 杨老师 _ 报告成绩 ...

  4. 组态中常用c语言代码,工业组态软件中CFC语言的设计实现及语言转换的研究

    摘要: 近年来随着IEC61131-3国际标准的正式公布与推广,基于此标准的工业自动化领域的组态软件,经过不断完善已日趋成熟并获得了广泛的应用组态软件作为DCS PLC SCADA等控制系统的上位机软 ...

  5. FPGA课程设计使用VHDL语言

    下面是FPGA的课程设计 使用VHDL语言,有程序和报告

  6. dsp课程设计c语言源码,DSP课程设计-基于C语言实现256点的FFT精选.pdf

    DSP课程设计-基于C语言实现256点的FFT精选 XX 大学 J1111111 UNIVERSITY DSP 课 程 设 计 基于CCS 的FFT 算法的C 语言实现和验证 学院名称: 专业班级: ...

  7. MATLAB AppDesigner 设计UI界面中调用自定义函数

    在MATLAB AppDesigner设计UI界面过程中,如果直接在APPDesigner代码编辑框中编写代码,如代码量较大,会导致代码混乱的问题.使用调用函数的方法能够解决该问题. 本文将介绍MAT ...

  8. 优秀的设计UI界面按钮素材,让点击率飙升

    快节奏的网络数码时代人们越来越离不开智能设备,面对屏幕上无数的按钮,点还是不点是个问题.不知道大家有没有发现,按钮越多,我们点击得越慢.这是因为只要有按钮,我们的下意识就会"检查" ...

  9. 可临摹学习的精致的音乐播放器界面设计ui模板

    美观的音乐应用设计,你更喜欢哪一款设计?哪一个设计更具可用性? 音乐应用程序,可以简化您如何享受朋友策划的播放列表. 可临摹学习的精致的音乐播放器界面设计ui模板! PSD格式可编辑,利于临摹学习! ...

最新文章

  1. 浅析x86架构中cache的组织结构
  2. MyBatis源码解析(二)——Environment环境
  3. 【Java线程安全】 synchronized同步方法、同步块:模拟抢票、模拟取款
  4. 国产主可控的嵌入式仿真测试软件SkyEye与可信编译器L2C的核心翻译介绍
  5. 根本无处可避的广东三游
  6. python pip download_Python Pip 参考手册 - pip download 命令
  7. mysql5.1版本 my.cnf中复制的配置不起作用
  8. Spring.NET 中的 ADO.NET 数据访问的示例
  9. JavaSE 学习笔记之正则表达式(二十五)
  10. Struts之logic标签库详解(转载)
  11. iframe中加载html页面,jQuery - 动态创建iframe并加载页面
  12. 最强面试题整理第一弹:Python 基础面试题(附答案)
  13. 数据库sql语句练习题
  14. mysql至少选修了两门课程_数据库中用关系代数表达式,查询至少选修两门课程的学生的学号和姓名怎么写?...
  15. excel打不开_excel表格中超链接打不开的解决办法
  16. tensorflow模型量化篇(1)量化方法及动态范围量化
  17. ES-分片路由(routing)
  18. 抗干扰神器光耦的原理及应用
  19. Java开发人员必须掌握的Linux命令(二)
  20. 小王的研发日记-自动对焦(硬件与计算机通信)

热门文章

  1. hadoop 3.x常用端口
  2. GuestBook Test
  3. 从头开始训练一个词性标注模型
  4. 浏览器javascript书签小应用
  5. linux打印机验证密码,HP LaserJet Pro打印机远程管理员密码泄露漏洞
  6. 基于Proteus的8×8LED点阵实验
  7. xSSD: DSSD,FSSD,ESSD,MDSSD,fireSSD
  8. 父子组件间传值,父传子,子传父
  9. LaTex科学论文写作入门
  10. PHP视频教程 全35讲rmvb格式下载