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的总体结构是一个
<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?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
2019-12-01 .NET开源类库Nini手册(INI、XML、注册表的配置应用)-中文翻译