WPF:XAML概述
简介
XAML是eXtensible Application Markup Language可扩展应用程序标记语言,它是微软公司为构建应用程序用户界面而创建的一种新的描述性语言。XAML提供了一种便于扩展和定位的语法来定义和程序逻辑分离的用户界面,而这种实现方式和ASP.NET中的"代码后置"模型非常类似。XAML是一种解析性的语言,尽管它也可以被编译。它的优点是简化编程式上的用户创建过程,应用时要添加代码等。
1.什么是XAML
软件开发中最典型的分工合作就是设计师(Designer)与程序员(Programmer)之间的协作。一般协作是这样进行的:
(1)需求分析结束后,程序员对照需求设计一个用户界面(User Interface,UI)的草图,然后把精力主要放在实现软件的功能上。
(2)与此同时,设计师对照需求、考虑用户的使用体验(User Experience,UX)、使用专门的设计工具(比如PS)设计出优美的UI。
(3)最后,程序员按照设计师绘制的效果图,使用编程语言实现软件的UI。
设计师和程序员的合作是“串行”的,如果设计师能与程序员“并行”工作并且直接参与程序开发中来,会解决很多问题。
微软借鉴了网络程序开发团队的经验,把开发模式从网络开发移植到桌面开发和富媒体网络程序的开发上,创造了一种新的开发语言-XAML(读作zaml)。全称为Extensible Application Markup Language,即可扩展应用程序标记语言。扮演着HTML+CSS+Javascript的角色。
设计师使用Blend来设计UI,程序员则使用VS开发后台逻辑代码。
2.XAML的优点
巨大优点是它帮助开发团队真正实现了UI与逻辑的剥离。
3.XAML入门
非空标签:<Tag Attribute1=Value1 Attribute2=Value2>Content</Tag>
空标签:<Tag Attribute1=Value1 Attribute2=Value2/>
Property(属性)属于面向对象理论范畴。在使用面向对象思想编程的时候,常常需要对客观事物进行抽象,再把抽象出来的结果封装成类,类中用来表示事物状态的成员就是Property。Property(属性)是针对对象而言的。
Attribute(特性)是语言层面的东西,是给编译器看的。Attribute只是用来影响类在程序中的用法,而Property则对应着抽象对象身上的形状,她们根本不是一个层面上的东西。比如有两个同类的语法元素A和B,为了表示A与B不完全相同或者A与B在用法上有些区别,这时候要针对A和B加一些Attribute。也就是说,Attribute只与语言层面上的东西相关,与抽象出来的对象没什么关系。因为Attribute表示“区分”的,所以把它译为“特征”。习惯上,英文中把标签式语言中表示一个标签特征的“名称-值”对称为Attribute。往往是一个标签所具有的 Attribute多于它所代表的对象的Property。
XAML是一种“声明”式语言,当你见到一个标签,就意味着声明了一个对象,对象之间的层级关系要么并列、要么是包含,全都体现在标签的关系上。
XAML使用标签来定义UI元素(UI Element),每个标签对应.NET Framework类库中的一个控件类。通过设置标签的Atrribute,不但可以对标签所有对应空间对象的Property进行赋值,还可以做一些额外的事件。
4.XAML 文档的树形结构
XAML使用树形逻辑结构来描述UI。例如
<Window>
<StackPanel>
<TextBox/>
<TextBox/>
<StackPanel>
<TextBox/>
<TextBox/>
</StackPanel>
<Button>
<Image/>
</Button>
</StackPanel>
</Window>
5.XAML中为对象属性赋值的语法
XAML中为对象属性赋值共有两种语法:
使用字符串进行简单赋值
使用属性元素进行复杂赋值
5.1 使用标签的Attribute为对象属性赋值
这种通过Attribute=Value语法赋值时,Value只可能是一个字符串值。
5.2使用TypeConverter类将XAML标签的Attribute与对象的Property进行映射(不懂)
5.3 属性元素
非空标签均有自己的内容(Content)。标签的内容指的就是夹在起始标签和结束标签之间的一些子级标签,每个子级标签都是父级标签内容的一个元素。
5.4标记扩展
所谓标记扩展,实际是一种特殊的Attribute=Value语法,其特殊的地方在于Value字符串是由一对花括号及其括起来的内容组成,XAML编译器会对这样的内容作出解析。生成相应的对象。
例如:
<TextBox Text="{Binding ElementName=slider,Path=Value,Mode=OneWay}"/>
6.事件处理器与代码后置
WPF支持XAML里为对象的事件指定事件处理器,方法是使用事件处理器的函数名为对应事件的Attribute进行赋值:<ClassName EventName="EventHandlerName">
代码后置:设计师用XAML为程序创建漂亮的“壳”(UI)并展现给客户;程序员用C#编写程序的“瓢”(逻辑)、从后台支持前面的“壳”--这种将逻辑代码与UI代码分离、隐藏在UI代码后面的形式就叫代码后置(Code-Behind)。
7.导入程序集和引用其中的名称空间
XAML引入名称空间的语法:xmlns:映射名=“clr-namespace:类库中名称空间的名字;assembly=类库文件名”。
一旦我们将类库中的名称引用XAML文档,我们就可以使用这些名称空间里的类。语法格式:<映射名:类名>...</映射名:类名>
8.XAML的注释
XAML的注释继承自XML,语法是:<!--需要被注释掉的内容-->
9.x名称空间
更多参考:XAML中X名称空间详解
大凡包含XAML代码的WPF成员都需要通过语句xmlns:x="http://schemas.microsoft.com/winfx/2006/xmal"来引入http://schemas.microsoft.com/winfx/2006/xmal这个名称空间。
x名称空间包含的工具
9.1 x:Class
这个Attribute的作用是告诉XAML编译器 XAML标签的编译结果与后台代码指定的类合并。
9.2 x:ClassModifier
这个Attribute的作用是告诉XAML编译有标签编译生成的类具有怎样的访问控制级别。
9.3 x:Name告诉XAML编译器,当一个标签带有x:Name时除了为这个标签生成对应实例外 还要为这个实例声明一引用变量,变量名就是x:Name的值。将XAML标签所对应对象的Name属性也设为x:Name的值,并把这个值注册到UI树上,以便查找。
x:Name的x加一个冒号,说明它来自x这个名称空间。这个名称空间是定义在XAML的根元素上的。也就是这句:
1. xmlns:x=[url]http://schemas.microsoft.com/winfx/2006/xaml[/url]
这个x就是XAML的字头了。这个名称空间的本意就是告诉我们——这个名称空间里所装的元素都与XAML解析有关。比如,我在代码里还使用了x:Code,把本来应该呆在C#代码里的内容请到XAML里来了。
可见,x:Name与Name根本不是一个层面上的东西——Name是直接与元素和面向对象编程相关的东西;x:Name是XAML语言解析层面上的东西。详细参考
9.4 x:FieldModifierx:FieldModifier用来在XAML里改变引用变量访问级别的。例如:
<TextBox x:Name="textBox1" x:FieldModifier="public" Margin="5"/> 默认的访问级别默认为internal。x:FiledModifier使用前提是这个标签同时也使用x:Name。
9.5 x:Key
x:Key的作用就是为资源贴上用于检索的索引。例如:
xmls:sys ="clr-namespae:System;assembly=mscorlib" <Window.Resources>以下四个标签扩展 9.6 x:Type
<sys:String x:Key="myString">Hello WPF Resource!</sys:String>
</Window.Resources> <Textbox Text="{StaticResourc ResourceKey=myString}"/>
x:Type的值应该是一个数据类的名称。
9.7 x:Nullxaml中的空值
9.8 x:Array
通过它的Items属性向使用者暴露一个类型已知的ArralyList实例,ArrayList内成员的类型又x:Array的Type指明。
9.9 x:Static
xaml中使用数据类型的static成员。
更多:查看MSDN
WPF:XAML概述的更多相关文章
- .Net Core WPF之XAML概述
原文链接,机器翻译,有误处参看原文. XAML overview in WPF 2019/08/08 What is XAML XAML syntax in brief Case and white ...
- XAML 概述
我们将向 Windows 运行时应用开发人员介绍 XAML 语言和 XAML 概念,并介绍在使用 XAML 创建 Windows 运行时应用时,在 XAML 中声明对象和设置属性的不同方式. 什么是 ...
- 标记扩展和 WPF XAML
本主题介绍 XAML 的标记扩展概念,包括其语法规则.用途以及底层的类对象模型. 标记扩展是 XAML 语言以及 XAML 服务的 .NET 实现的常规功能. 本主题专门详细论述了用于 WPF X ...
- WPF XAML之bing使用StringFormat
WPF XAML之bing使用StringFormat // 转化为百分比 Text="{Binding Progress, StringFormat=\{0:P\}}" < ...
- [WPF,XAML] 跳动的心
原文:[WPF,XAML] 跳动的心 没什么艺术细胞,原谅,原谅! <Canvas Width="0" Height="0"> <Canvas ...
- WPF XAML
xmlns 在xml中专门用于声明名字控件, xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 是 ...
- 使用MVVM DataTemplate在WPF XAML视图之间切换
原文 使用MVVM DataTemplate在WPF XAML视图之间切换 更新:这个技术的改进版本,一个不创建视图,可以在以下链接找到: http://www.technical-recipes.c ...
- 使用MVVM DataTriggers在WPF XAML视图之间切换/Window窗口自适应内容大小并居中
原文 使用MVVM DataTriggers在WPF XAML视图之间切换 相关文章: http://www.technical-recipes.com/2016/switching-between- ...
- [转]WPF焦点概述
WPF 中,有两个与焦点有关的主要概念:键盘焦点和逻辑焦点. 键盘焦点指接收键盘输入的元素,而逻辑焦点指焦点范围中具有焦点的元素. 本概述将详细介绍这些概念. 理解这些概念之间的区别对于创建具有可以获 ...
随机推荐
- Django学习笔记之使用 Django项目开发框架
Django 项目是一个定制框架,它源自一个在线新闻 Web 站点,于 2005 年以开源的形式被释放出来.Django 框架的核心组件有: 用于创建模型的对象关系映射 为最终用户设计的完美管理界面 ...
- 20145240 GDB调试汇编堆栈过程分析
20145240 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...
- RN app打包
最近使用React Native做起了移动应用,之前做过一点react,有一点react基础,后来听说RN还不错,就做起了RN项目.为了让辛辛苦苦开发的项目想在手机端运行,就涉及到发布打包. 防止自己 ...
- Linux(CentOS)中常用软件安装,使用及异常——XManager, 中文支持,JDK
XManager图形化界面远程连接 采用Xshell的方式可以不用在CentOS系统中配置即可以相连,主要原理就是SSH连接的方式,但是XManager图形化界面远程连接是需要修改CentOS系统的. ...
- 什么是webhook
什么是webhook 翻译,原文地址:https://sendgrid.com/blog/webhook-vs-api-whats-difference/ 一.概述 Webhook是一个API概念,并 ...
- Redis单线程原理
redis是以socket方式通信,socket服务端可同时接受多个客户端请求连接,也就是说,redis服务同时面对多个redis客户端连接请求,而redis服务本身是单线程运行. 假设,现在有A,B ...
- ==和equals在比较字符串时候的区别
作为一个菜鸟 之前一直迷茫 都说比较字符串要用equals()方法 但是有时候用==貌似也可以 话不多说 先来一个例子 public static void main(String[] arg ...
- LeetCode——single-number系列
LeetCode--single-number系列 Question 1 Given an array of integers, every element appears twice except ...
- VS 安装部署项目自解压程序解压后按顺序执行多个程序
这篇blog介绍了如何用VS创建安装部署方案,以及如何制作自解压程序.然后我的程序中需要解压后按照顺序先后安装2个exe.winrar的解压后执行,虽然可以用分号填写多个应用,但貌似是同时执行的.为了 ...
- Linux平台下Oracle定时备份数据
临时收到一个任务,就是在生产环境上定时备份oracle的数据.空闲时间搞了一下,真是一波三折,过程有点小郁闷,结果哈哈.现在进行总结一下 (1)新建一个shell脚本test.sh #!/bin/ba ...