WPF之认识XAML
新建项目
在Visual Studio 2019中使用WPF项目模板建立一个最简单的WPF项目,如下图所示:

可以看到,项目里面主要有两个分支:
- App.xaml分支:程序的主体,声明了程序的进程会是谁,同时指定了程序的主窗体是谁,分支里的App.xaml.cs是App.xaml的后台代码。
- MainWindow.xaml分支:程序的主窗体,具有自己的后台代码Windowl.xaml.cs,默认两个文件。
在Windows系统里一个程序就是一个进程(Proces),一个GUl进程需要有一个窗体(Window)作为“主窗体”。
接下来我们重点分析MainWindow.xaml和它的后台代码。
剖析XAML代码
在MainWindow.xaml里能看到如下代码:
<Window x:Class="LearnWpf.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:LearnWpf"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
</Grid>
</Window>
XAML是一种由XML派生而来的语言,很多XML中的概念在XAML是通用的,如:
- 使用标签声明一个元素(每个元素对应内存中的一个对象)时需要使用起始标签<Tag>和终止标签</Tag>
- 夹在起始标签和终止标签中的XAML代码表示是隶属于这个标签的内容
- 如果没有什么内容隶属于某个标签,则这个标签称为空标签,可以写为<Tag/>
为了表示同类标签中的某个标签与众不同,可以给它的特征(Attribute)赋值,为特征赋值的语法如下:
- 非空标签:<Tag Attributel=Valuel Attribute2=Value2>Content
- 空标签:<Tag Attributel=Valuel Attribute2=Value2/>
为了表示同类标签中的某个标签与众不同,可以给它的特征(Atribute)赋值。为特征赋值的语法如下:
·非空标签:<Tag Aributel=Valuel Attribute2-Value2>Content
·空标签:<Tag Attributel=Valuel Attribute2=Value2>
注意Attribute(特性)和Property(属性)的区别,Attribute和Property是两个层面上的东西:
- Attribute则是编程语言文法层面的东西,只与语言层面上的东西相关
- Property属于面向对象理论范畴,是针对对象而言的
- XAML中把标签的Attribute与对象的Property做了一个映射,但也不是完全映射的,比如,x:Class特性
MainWindow.xaml的总体结构是一个标签内部包含着一个标签(或者说标签是标签的内容,如下代码段所示),代表的含义是一个窗体对象内嵌套着一个Grid对象:
<Window>
<Grid>
</Grid>
</Window>
<Window>标签的Attribute如下所示:
x:Class="LearnWpf.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:LearnWpf"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800"
- 最上面一行是在使用名为Class的Aturibute,这个Attribute来自于x:前缀所对应的名称空间,x:Class特性告诉XAML编译器将编译结果和哪个C#编译的类合并
- 中间五行是在声明名称空间,xmlns也就是XML-Namespace的缩写,xmlns后可以跟一个可选的映射前缀并用冒号分隔
- mc:Ignorable命名空间提供了xaml处理器“忽略”的xaml定义,允许您指定设计者在设计时使用的信息(在运行时被忽略),如d:DesignHeight="725" d:DesignWidth="1015"
- Title、Height和Width是与Window对象的Property相对应的
如果没有写可选映射前缀,那就意味着所有来自于这个名称空间的标签前都不用加前缀,这个没有映射前缀的名称空间称为“默认名称空间”——默认名称空间只能有一个,而且应该选择其中元素被最频繁使用的名称空间来充当默认名称空间。
上面看上去像网页地址的名称空间是XAML解析器的一个硬性编码(hard-coding),只要见到这些固定的字符串就会把一系列必要的程序集(Assembly)和程序集中包含的.NET名称空间引用进来。在XAML中引用外来程序集和其中.NET名称空间与C#的语法不同,需要在根元素的起始标签中声明命名空间,如:xmlns:c="clr-namespace:System.Windows.Controls;assembly=PresentationFramework",c是映射前缀(可换成其他的字符串,如control),其中的命名空间、程序集根据实际情况确定。硬性编码可以看成批量的程序集和程序集中包含的.NET名称空间引用,它们共用一个命名空间前缀。
参考资料
深入浅出WPF-从零起步认识XAML 网盘提取码:5w20
WPF学习之X名称空间详解
c# – 什么意思mc:Ignorable =“d”在WPF?
WPF之认识XAML的更多相关文章
- 学习WPF——了解WPF中的XAML
XAML的简单说明 XAML是用于实例化.NET对象的标记语言,主要用于构建WPF的用户界面 XAML中的每一个元素都映射为.NET类的一个实例,例如<Button>映射为WPF的Butt ...
- WPF后台设置xaml控件的样式System.Windows.Style
WPF后台设置xaml控件的样式System.Windows.Style 摘-自 :感谢 作者: IT小兵 http://3w.suchso.com/projecteac-tual/wpf-zhi ...
- WPF后台访问XAML元素
当我们需要从后台访问xaml文件时,我们可以通过这样的方式来操作: private void button1_Click(object sender, RoutedEventArgs e) { Sys ...
- WPF中 PropertyPath XAML 语法
原文:WPF中 PropertyPath XAML 语法 PropertyPath 对象支持复杂的内联XAML语法用来设置各种各样的属性,这些属性把PropertyPath类型作为它们的值.这篇文章讨 ...
- 【广州.NET社区推荐】【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性
原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...
- 【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性
原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...
- WPF 绑定属性 XAML 时间格式化
原文:WPF 绑定属性 XAML 时间格式化 XAML 时间格式化{Binding Birthday,StringFormat='yyyy-MM-dd '} public class AssetCla ...
- WPF关于Generic.xaml
如果需要用到Themes/Generic.xaml作为默认风格资源文件,不要忘了该项目的AssemblyInfo.cs中必须要有以下这段: [assembly: ThemeInfo( Resource ...
- 关于WPF中的XAML
XAML全称extensible application markup language(可扩展性标记语言) 可扩展应用程序标记语言(XAML)是一种声明性语言.概括来说,就是为应用程序构建UI.目前 ...
- 在C#的WPF程序使用XAML实现画线
在WPF中画直线.新建WPF应用程序,使用XAML画直线.使用X1.Y1两个属性可以设置直线的起点坐标,X2.Y2两个属性则可以设置直线的终点坐标.控制起点/终点坐标就可以实现平行.交错等效果.Str ...
随机推荐
- SpringCloud-04-http客户端Feign
http客户端Feign 1.Feign的介绍 Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign 其作用就是帮助我们优雅的实现ht ...
- Golang中make和new的区别
1. 相同点 都是内建函数,都是在堆上分配内存,都需要传递类型参数 2. 不同点 传递的参数不一样,new函数只接收一个参数,make函数可以接收一个以上的参数 package main import ...
- JVM(Java虚拟机)整理(二)
前言 上一篇内容:JVM(Java虚拟机)整理(一)https://www.cnblogs.com/xiegongzi/p/17994659 Java 内存模型(JMM) Java 内存模型引入 声明 ...
- 单片机 IAP 功能基础开发篇之APP升级(三)
1 前言 上一篇单片机 IAP 功能基础开发篇之APP升级(二)讲到了单片机给 APP 程序升级具体的设计方案,这篇介绍的是升级进阶功能,如何在编译后在程序结束地址自动加上校验标志(可以通过脚本工具, ...
- 小知识:PDML的注意事项补充
关于PDML,之前在 并行,想说爱你不容易中的第一节就介绍过,今天在客户现场协助测试时又遇到几个有关PDML的问题,都蛮典型的,记录一下: 问题1:某存储过程报错ORA-12839. 查看该错误号说明 ...
- linux统计文件大小-以KB、MB、GB、TB为单位
fileSize=`hadoop fs -ls /data/internetLog/home/DPI/idc/20180806/*201808062[0-2]* | awk 'BEGIN{ sum=0 ...
- react 快速接入 sentry,性能监控与错误上报踩坑日记
壹 ❀ 引 本文是我入职第一个月所写,在主导基建组的这段时间也难免会与错误监控和性能监控打交道,因为公司主要考虑接入sentry,所以对于接入sentry的基建任务也提了一些需求,主要分为: 支持查看 ...
- NC22600 Rinne Loves Dynamic Graph
题目链接 题目 题目描述 Rinne 学到了一个新的奇妙的东西叫做动态图,这里的动态图的定义是边权可以随着操作而变动的图. 当我们在这个图上经过一条边的时候,这个图上所有边的边权都会发生变动. 定义变 ...
- NC16544 简单环
题目链接 题目 题目描述 给定一张n个点m条边的无向图,求出图中所有简单环的数量.(简单环:简单环又称简单回路,图的顶点序列中,除了第一个顶点和最后一个顶点相同外,其余顶点不重复出现的回路叫简单回路. ...
- Sora文生视频模型深度剖析:全网独家指南,洞悉98%关键信息,纯干货
Sora文生视频模型深度剖析:全网独家指南,洞悉98%关键信息,纯干货 Sora是一个以视频生成为核心的多能力模型,具备以下能力: 文/图生成视频 视频生成视频 1分钟超长高质量视频生成 视频裂变多视 ...