1、什么是XAML
XAML是WPF技术中专门用于设计UI的语言,它在桌面开发及富媒体网络程序的开发中扮演了HTML+CSS+JAVASCRIPT的角色,成为设计师和程序员之间沟通的桥梁。它帮助开发团队真正实现了UI与逻辑的分离。
2、解析最简单的XAML代码
我们新建一个WPF项目,然后打开UI设计界面,代码如下:
<Window x:Class="WpfApp1.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:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
</Grid>
</Window>
我们看到有很多属性名为xmlns的属性,那xmlns是什么呢?其实这个属性的全拼是:XML namespace,即XML命令空间。
那为什么命令空间后面是一个网址呢?因为这里只是XAML解析器的一个硬性编码,只要见到这些固定的字符串,就会把一系列必要的程序集和程序集中包含的.NET命名空间引用进来。
我们先看第二行:xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"。这个网址表示的命令空间基本包括了设计界面所需要的程序集,比如:System.Windows.Controls。
再看第三行:xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"。我们看到xmlns后面加了一个冒号和一个x,这叫做:可选的映射前缀。为什么叫可选的呢?因为它可以不写,就像第二行。如果不写,那这个命令空间就是默认的。
我们来做个实验,在第二行xmlns后面加上前缀:xmlns:a="http://schemas.microsoft.com/winfx/2006/xaml/presentation",再编译一下,发现编译失败。如图:
在Window和Grid标签前面加上前缀就可以编译了,a:Window,a:Grid。这个实验说明2个问题:1、Window和Grid在第二行的命名空间中;2、当命名空间是默认的,就不需要在该命令空间的标签前面加前缀了。
第三行的网址也是表示一个程序集,这个程序集对应的是一些与XAMLA语法和编译相关的CLR命名空间。
我们再看第一行:x:Class="WpfApp1.MainWindow"。这个x前缀就是对应了第三行的x映射的命名空间(这个实验大家可以自己做)。下面我们重点看一下WpfApp1.MainWindow。
这个就是典型的命令空间.类名,和c#是一样的。我们来做一个实验:把x:Class="WpfApp1.MainWindow"删掉,编译。
发现编译错误,错误信息如下:error CS0103: 当前上下文中不存在名称“InitializeComponent”
学到winform开发的人都知道InitializeComponent函数是在界面的构造函数中执行的,用来初始化所有的界面控件。但是在WPF项目中,我们转到这个函数的定义的时候,发现这个函数所在文件的路径是:obj/debug/MainWindow.g.i.cs。我们知道obj目录是用来临时存储编译结果的,并不属于源代码。那这个其实是XAML文件的编译结果。
我们注意到在MainWindow.xaml.cs文件中,定义MainWindow类时使用了partial这个关键字,这个关键字的作用是把一个类分开在两个地方定义,这个和winform是一样的。但是在winform里面把InitializeComponent函数转到定义时可以看到源码,在WPF中是看不到的。
x:Class="WpfApp1.MainWindow",这条语句的作用其实是使用partial关键字把MainWindow类在XAML里面定义了,而且InitializeComponent函数也是定义在这个类里。因为当你把这条语句改为:x:Class="WpfApp1.MainWindow123",编译器会说当前上下文不存在InitializeComponent。
说到这里,大家应该可以感觉的到partial关键字在实现UI和逻辑分离的强大作用了。
再看xmlns:local="clr-namespace:WpfApp1",这条语句其实是把当前的命名空间加进来了,当前的命名空间就是WpfApp1。这样的话,我们就可以在XAML中引用该命名空间下的类,当然还要在该类的前面加上前缀local。
来源:CSDN
作者:begeneral
链接:https://blog.csdn.net/niechaoya/article/details/104165301