WPF是用于替代Windows Form来创建Windows客户端的应用程序,和Web项目一样遵从前端布局和后端代码实现分离的原则,Web项目前端通常是HTML,而XAML是用作WPF项目前端界面开发,XAML的全称是 Extensible Application Markup Language,基于通用XML语法用于实例化 .NET对象的标记语言。基本情况如下图
XAML 文档中的每个元素都映射为.NET类的一个实例,如根元素<Window>表示WPF创建Window对象,另外根元素还有<Application>、<Page>、<UserControl>,事实上XAML在编译时也会编成C#类,所以界面对应的.cs文件内的后台代码内要声明 partial 关键字,从而达到在编译的时候UI界面和运行逻辑代码合在一起的状态。如下最基本的XAML代码
<Window x:Class="WpfApp2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> </Grid> </Window>
上述仅包含Window元素以及Grid元素,Window元素代表整个窗口,Grid 可以放置所有的控件。总体结构其实是一个窗体对象内嵌套一个Grid对象。x:Class 代表后端的命名空间和类名,这样的好处在于将WPF里的前端XAML和后端实现代码分开维护,xmlns全拼是:XML namespace,即XML命令空间,xmlns后面可以跟一个可选映射前缀 x,两者之间用冒号分割,另外还声明了两个 xmlns 名称空间,如下表
名称 | 说明 |
http://schemas.microsoft.com/winfx/2006/xaml/presentation | WPF核心名称空间,包含了所有WPF类,包括用来构建用户界面的控件 |
http://schemas.microsoft.com/winfx/2006/xaml | XAML名称空间,该名称空间被映射为前缀 xmlns:x,可通过前缀x来使用该名称空间,如<x:ElementName> |
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib" Title="MainWindow" Height="300" Width="300"> <ListBox> <ListBoxItem> <sys:String>this is demo</sys:String> </ListBoxItem> </ListBox> </Window>
xmlns:sys="clr-namespace:System;assembly=mscorlib" 表示将 sys 前缀 映射到.NET基类库System名称空间,后续用<sys:String>获取字符串类型,类似若想引入其他.NET程序集支持的基类,参考如下语法 xmlns:Prefix="clr-namespace:Namespace;assembly=AssemblyName"
名称 | 说明 |
Prefix | XAML标记中用于指示名称空间的XML前缀 |
Namespace | 完全限定.NET命名空间的名称 |
AssemblyName | 声明类型的程序集 |
例如反序列化攻击载荷常用的Diagnostics.Process类所在的程序集: xmlns:c="clr-namespace:System.Diagnostics;assembly=system"
笔者创建的项目名ObjectDataProvider有一定迷惑性,这里说明下和反序列化用到的ObjectDataProvider类毫无关联