WPF学习笔记:XAML入门

青春壹個敷衍的年華 提交于 2020-02-04 11:57:29

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。

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!