《深入浅出WPF》学习总结之XAML标签语言一
一、XMAL概览
1、XAML在桌面开发及富媒体网络程序的开发中扮演了HTML+CSS+JS的角色。
2、XAML可以将UI和逻辑代码分离,降低耦合度。
3、XAML是一种单纯的申明形语言
4、XAML是由XML派生而来的语言,所以很多XML中的概念在XAML中是通用的
5、XAML是一种“声明”式语言,当你看见一个标签,就意味着声明了一个对象,对象之间的层级关系是并列、要么包含。全都体现在标签的关系上
二、剖析最简单的XAML
<Window x:Class="WpfApp4.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:WpfApp4"
mc:Ignorable="d"
Title="Main Window" Height="450" Width="800">
<Grid>
</Grid>
</Window>
其中,Title、Height和Width是与Window对象的Property相对应的。
第3行的xmlns表示引用引用命名空间。冒号表示映射命名空间。在后面使用的方式为 映射名:类名 如果没有写前缀,那就意味着所有来自于这个空间的标签前都不用加前缀,就成为默认名称,默认名称自能有一个,其他就必须加前缀
第2行像地址的命名空间是XAML解析器的一个硬性编码,要见到这些固定字符串,就会把一系列必要的程序集(Assembly)和程序集中包含的.NET名称空间引用进来。
三、XAML中为对象属性赋值的语法
XAML是一种声明性语言,XAML编译器会为每个标签创建一个与之对应的对象,对象创建出来之后要对他的属性进行必要的初始化之后才有意义。因为XAML语言不能编写程序的运行逻辑,所以一份XAML文档中除了使用标签声明对象就是初始化对象的属性了
XAML中为对象属性赋值共有两种语法
1、使用字符串进行简单赋值
2、使用属性元素(Property Element)进行复杂赋值
<!--使用字符串进行简单赋值-->
<Grid HorizontalAlignment="Center" VerticalAlignment="Center">
<Rectangle Width="200" Height="100" Fill="Blue"></Rectangle>
</Grid>
<!--使用属性元素(Property Element)进行复杂赋值-->
<Grid HorizontalAlignment="Center" VerticalAlignment="Center">
<Rectangle Width="200" Height="100">
<Rectangle.Fill>
<SolidColorBrush Color="Blue"/>
</Rectangle.Fill>
</Rectangle>
</Grid> <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
<Rectangle Width="200" Height="100">
<Rectangle.Fill>
<LinearGradientBrush>
<LinearGradientBrush.StartPoint>
<Point X="0" Y="0"/>
</LinearGradientBrush.StartPoint>
<LinearGradientBrush.EndPoint>
<Point X="1" Y="1"/>
</LinearGradientBrush.EndPoint>
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Offset="0.2" Color="LightBlue"/>
<GradientStop Offset="0.7" Color="Blue"/>
<GradientStop Offset="1.0" Color="DarkBlue"/>
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
</Grid>
简化XAML属性赋值的技巧
1、能使用Attribute=Value形式的赋值就不使用属性元素
2、充分利用默认值,去除冗余
3、充分利用XAML的简写方式
四、标记扩展
所谓标记扩展,实际上是一种特殊的Attribute=Value语法,其特殊的地方在于Value字符串是由一对花括号及其括起来的内容组成,XAML编译器会对这样的内容做出解析,生成相对应的对象。
<StackPanel>
<TextBox Margin="5" Text="{Binding ElementName=slider1, Path=Value, Mode=OneWay}"></TextBox>
<Slider Name="slider1" Margin="5"></Slider>
</StackPanel>
其中,Text="{Binding ElementName=slider1, Path=Value, Mode=OneWay}"就是标记扩展了。我们分析一下这句代码
1、当编译器看到这句代码时就会把花括号里的内容解析成对应的对象
2、对象的数据类型就是紧邻左花括号的字符串
3、对象的属性由一串以逗号连接的子字符串负责初始化(注意,属性值不再加引号。属性之间通过逗号隔开。类似于C#对象的初始化器)
尽管标记扩展的语法简介方便,但并不是所有对象都能用标记扩展的语法来书写,只有MarkupExtension类的派生类(直接或间接均可)才能使用标记扩展来创建对象。
使用标记扩展需要注意的几点:
1、标记扩展是可以嵌套的,例如Text="{Binding Source = {StaticResource myDataSource}, Path = PersonName}"是正确的
2、标记扩展具有一些简写语法,例如"{Binding Value ...}"与"{Binding Path=Value...}"是等价的,"{StaticResource myString...}"与"{StaticResource ResourceKey=myString}"是等价的。两种写法中,前者成为固定位置参数(Positional Parameter)后者成为具名参数(Named Parameters)。固定位置参数实际上就是标记扩展类构造器的参数,其位置由构造器参数列表决定。
3、标记扩展类的类名均以单词Extension为后缀,在XAML中使用它们的时候Extension后缀可以省略不写,比如写Text="{x:Static...}"与Text="{x:StaticExtension...}"是等价的。
五、事件处理器与代码后置类
事件处理器
当一个XAML标签对应着一个对象时,这个标签的一部分Attribute会对应这个对象的Property。除了这部分对应着对象Property的Attribute外,还有一部分Attribute会对应着对象的事件(Event)。<Button>标签有一个名为Click的Attribute,它对应的就是Button类的Click事件
<ClassName EventName = "EventHandlerName"/>
如果把<Button x:Name = "btnTest" Click="btnTest_Click"/>这句话转化为C# WinForm代码,基本上为
var btnTest = new Button();
btnTest.Click+=btnTest_Click;
代码后置(Code-Behind)
C#编写的代码用于处理程序的逻辑,需要与UI的XAML代码分开。由于c#支持partial类,XAML标签又可以使用x:Class特征来指定将由XAML代码解析生成的类与哪个类合并,因此我们完全可以把用于实现的程序逻辑的C#代码放在一个文件里,把用于描述程序UI的XAML代码放在另一个文件里。并且让事件性Attribute充当XAML与C#之间沟通的纽带。从后台控制前面的UI,这种将逻辑代码与UI代码分离,隐藏在UI代码后面的形式叫做代码后置
<Grid>
<Button x:Name="btnTest" Content="ClickMe" Width="" Height="" Click="btnTest_Click"></Button>
</Grid> private void btnTest_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show((sender as Button).Content.ToString());
}
注意:
不只是事件处理器,一切用于实现程序逻辑处理的代码都要放在后置的C#文件中
默认情况下,VS为每个XAML文件生成的后置代码文件名为"XAML文件全名.cs",比如XAML文件名为MyWindow.xaml,那么他的后置代码名为MyWindow.xaml.cs。这样做是为了方便管理文件,但并不是必要的,只要XAML解析器能找到x:Class所指定的类,无论你的文件叫什么名字都可以。
XAML的后置代码一样可以写到XAML文件中,需要使用x:Code标签。x:Code的内容一定要使用XML语言的<![CDATA[...]]>转义标签。但不推荐,这样会增加前后端耦合度
<Grid>
<Button x:Name="btnTest" Content="ClickMe" Width="80" Height="30" Click="btnTest_Click"></Button>
</Grid> <x:Code>
<![CDATA[
private void btnTest_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show((sender as Button).Content.ToString());
}
]]>
</x:Code>
六、导入程序集和引用其中的命名空间
想在自己的程序里引用类库,主要分三个步骤
1、编写类库项目并编译得到.dll文件或者获得别人编译的.dll文件
2、将类库项目或者.dll引进自己的项目
3、在C#和XAML中引用类库中的名称空间
xmlns:映射名="clr-namespace:类库中名称空间的名字,assembly=类库文件名"
XAML中引用名称空间的映射名类似于C#中的
using Cnn = Connection;
七、XAML的注释
XAML的注释语法亦继承自XML,语法:
<!-- 需要注释的内容 -->
注意:
1、XAML注释只能出现在标签的内容区域,即只能出现在开始标签和结束标签之间
2、XAML注释不能用于注释标签的Attribute
3、XAML注释不能嵌套
《深入浅出WPF》学习总结之XAML标签语言一的更多相关文章
- 《深入浅出WPF》学习总结之XAML标签语言二
x名称空间 “x名称空间”的这个X是映射XML名称空间时给他取的名字(如果用的是字母y,那他就叫“y名称空间了”),x名称空间里的成员(x.name.x.class)是专门给XAML编译器看的.用来引 ...
- WPF学习笔记1——XAML之1
参考文献: http://msdn.microsoft.com/zh-cn/library/ms752059(v=vs.110).aspx <Pro WPF 4.5 in C# > 一.X ...
- WPF学习笔记——认识XAML
Extensible Application Markup Language,XAML是一种声明性标记语言. 一.XAML语法概述 1,与XML类似,用尖括号标记元素 <StackPanel&g ...
- WPF学习笔记2——XAML之2
三.事件处理程序与代码隐藏 例如,为一个Page添加一个Button控件,并为该Button添加事件名称Button_Click: <Page xmlns="http://schema ...
- WPF学习一:XAML的资源(Resources)结构
一个初学者,把知识做个积累,如果有不对的地方,还请高手指出,谢谢! 先看一段代码:(下面是以Window WPF进行讲解,如果是Web 的话就把<Window改为<Page 而如果是 Us ...
- WPF学习笔记 - 在XAML里绑定
Binding除了默认构造函数外,还有一个可以传入Path的构造函数,下面两种方式实现的功能是一样的. <TextBlock x:Name="currentFolder" D ...
- JavaWeb学习总结-12 JSTL标签语言
一 JSTL JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. 除了 ...
- 《深入浅出WPF》 学习笔记
<深入浅出WPF> 序言 1. 什么是WPF 2. 为什么要学习WPF 第一章 XAML概览 1. XAML是什么? 2. XAML有哪些优点 第二章 从零起步认识XAML 1. 新 ...
- 4 WPF学习---系统的学习XAML语法
转载:http://blog.csdn.net/fwj380891124/article/details/8093001 1,XAML文档的树形结构: UI在用户眼里面是个平面结构.如下图所示,在用户 ...
随机推荐
- Zabbix--06主动模式和被动模式、低级自动发现、性能优化、
目录 一. Zabbix主动模式和被动模式 1.克隆模版 2.修改克隆后的模版为主动模式 3.修改监控主机关联的模版为主动模式 4.修改客户端配置文件并重启 5.查看最新数据 二.Zabbix低级自动 ...
- [编译原理]用BDD方式开发lisp解释器(编译器)|开发语言java|Groovy|Spock
lisp是一门简单又强大的语言,其语法极其简单: (+ 1 2 ) 上面的意思 是:+是方法或函数,1 ,2 是参数,fn=1+2,即对1,2进行相加求值,结果是:3 双括号用来提醒解释器开始和结束. ...
- Vue中的组件及缓存 keep-alive
<script> import { mapState } from "vuex"; export default { data() { return { ...
- 为何使用Shell脚本
为何使用Shell脚本 分类: linux shell脚本学习2012-09-12 17:18 78人阅读 评论(0) 收藏 举报 shell脚本任务工作 s h e l l 脚本在处 ...
- springboot+mybatis 配置sql打印日志
第一种: 配置类型 # 配置slq打印日志 logging.level.com.lawt.repository.mapper=debug重点: #其中 com.lawt.repository.ma ...
- C#(.net)实现用apache activemq传递SQLite的数据
版权声明:本文为搜集借鉴各类文章的原创文章,转载请注明出处:http://www.cnblogs.com/2186009311CFF/p/6382623.html. C#(.net)实现用apache ...
- ExtJS用Grid显示数据后如何自动选取第一条记录
用Grid显示数据后,如何让系统自动选取第一条记录呢?在显示Grid时由于其Store正在loading,没法在Grid选取第一条记录,因为还没有记录,所以应在其Store进行操作. 查看Ext.da ...
- 【Java】使用@Valid+BindingResult进行controller参数校验
@Valid @Valid注解用于校验,所属的包: javax.validation.Valid. 你可以定义实体,在实体的属性上添加校验规则,在API接收数据时添加@Valid注解,这时你的实体将会 ...
- 【CF1252F】Regular Forestation(重心,树同构)
题意:给定一棵n个点的树,问删去某个点之后所有的树同构,这样分割出来的树最多能有几棵 n<=4000 思路:分割成至少两个size相等的联通块之后size必定小于n/2,与树的重心的定义相同 预 ...
- Charles抓取手机https请求
1.下载Charles工具,3.92破解版:http://pan.baidu.com/s/1cko2L4 密码:chmy 2.安装SSL证书,默认安装就可以 3.证书安装成功后,点击详细信息--> ...