每一个新建的WPF程序,核心部分包括:
1、Properties:程序会用到的一些资源(图标、图片、静态字符串)和配置信息
2、引用:标记当前项目需要引用哪些其他项目。
3、App.xaml:程序主体,App.xaml文件用于声明程序进程会是谁,同时指定程序主窗体是谁。
4、MainWindow.xaml:程序主窗体。
xaml文件都会带有xaml.cs文件。
重点是MainWindow.xaml。
<Window x:Class="WPF_1_XAML.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>
xaml是xml的派生语言,很多概念彼此通用。要注意,每个标签都会对应内存中的一个对象。
xaml包括2种写法:
1、非空标签:<Tag Attribute1=Value1 Attribute2=Value2>Content</Tag>
2、空标签:<Tag Attribute1=Value1 />
Property是一类抽象事物所具有的特性,Attribute则是为了区分同类元素A和B的区别特征。
一、xmlns
xmlns特征用来定义命名空间,语法特征为:xmlns [:可选的映射前缀]="命名空间"。
如果不使用映射前缀,那么所有来自于这个命名空间的标签前都不用加前缀,这个没有映射前缀的命名空间被称为“默认命名空间”,它只能有一个,一般会选择使用频率最高的命名空间来充当默认命名空间。
<Window>和<Grid>都来自于xmlns所在的默认命名空间。
而第一行的Class特征则来自于第三行中x:前缀对应的命名空间。如果修改了默认命名空间,比如加入了前缀,那么它对应的xaml元素也要一并加入前缀。
<n:Window x:Class="WPF_1_XAML.MainWindow" xmlns:n="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <n:Grid> </n:Grid> </n:Window>
如果要引用外来程序集,比如System.Windows.Controls命名空间里的Button类,则先要把包含System.Windows.Controls命名空间的程序集PresentationFramework.dll通过引用的方式引用到项目中,然后再在根元素的起始标签中写上一句:xmlns:c="clr-namespace:System.Windows.Controls;assembly=PresentationFramework",当然编译器会自动补全这一串。
其中类似http://,,,这一类的xmlns被称为硬编码,它会把一系列必要的程序集和.NET命名空间包含进来,注意是一系列而不是一个。
x:Class=“WPF_1_XAML.MainWindow”这个Attribute的作用是当xaml解析器将包含它的标签解析成C#类后,这个类的类名是什么。因此,如果删除x:Class和cs中InitializeComponent,程序还是可以运行的,因为App.xaml中指定了StartupUri="MainWindow.xaml",而如果恢复x:Class这一行,但改名为MainWindow1.xaml,再编译,生成的就是MainWindow1为名的窗体。
再注意到,MainWindow.xaml.cs中有一个partial关键字,于是其核心意义就很明显了:
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } }
XAML解析生成的类和对应XAML.CS的类都是MainWindow的部分类,正是由于这种partial机制,类的逻辑代码留在了xaml.cs中,而与声明和布局相关的UI被分离到xaml中,实现了UI和逻辑的分离。