WPF菜鸟谈之XAML
WPF菜鸟谈之XAML
让我们先以一个简单的demo作为开始。
可以看见VS自动为我们创建了两个.xaml文件:App.xaml和MainWindow.xaml。
那什么是XAML呢?
微软给出的解释是:Extensible Application Markup Language (XAML) 是声明性应用程序编程标记语言。 Windows Presentation Foundation (WPF) 实现 XAML 处理器实现,并提供 XAML 语言支持。 WPF 类型得以实现,这样,它们将能够为 XAML 表示形式提供必需的类型支持。通常,可以在 XAML 标记中创建大部分 WPF 应用程序 UI。
从中我们看出WPF与XAML之间的关系:WPF利用XAML构建自己的UI。
现在让我们打开第二个XAML文件:MainWindow.XAML。
<Window x:Class="Rookie_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>
我们可以看见第二行有个“xmlns”,这其实是指XML Namespace,即XML名称空间,XAML文件其实是XML文件,遵循XML的格式和规范。而XML为了验证自己和子元素的合法性,通过使用xmlns来保证XML文档中的元素和属性名字的合法性,作用就和.NET里的NameSpace 差不多。并且在WPF中,加上“XAML”后面的特性值就映射到了整个WPF命名空间,作用就像下面.
using System.Windows; using System.Windows.Automation using System.Windows.Controls; using System.Windows.Controls.Primitives using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Forms.Integration; using System.Windows.Ink; using System.Windows.Media.Animation; using System.Windows.Media.Effects; using System.Windows.Media.Media3D; using System.Windows.Media.TextFormatting;
上面的工作都是编译器自动帮我们做的,我们的工作是不是轻松许多?
再来看下面的“xmlns:x”,比上面多了一个“x”,它的作用又是什么呢?原来在XML中xmlns语法遵循这样的格式:
xmlns[:映射前缀]=”名称空间”
其中映射前缀是可选的,但如果不加则表示为默认名称空间,且默认名称有且只有一个。而加上前缀后,xml就可以区分不同的名称空间,而不至于引起混淆。
好了回到主题,说说“xmlns:x”的作用:映射到System.Windows.Markup命名空间,
也定义了XAML编译器或解析器中的一些特殊的指令。
再往上看,有个“x:Class”,这里的“x”就是上面所说的前缀“x”。这个特性的作用是告诉XAML解析器使用指定的名称生成一个类。
看完了XAML文件,让我们再来看看CS文件。打开MainWindow.cs
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } }
哎,等等,”MainWindow”?是不是感觉在哪里见过?哈哈,聪明的你一定知道了:不就是上面的“x:Class="Rookie_XAML.MainWindow"”中指明的那个类嘛!
Bingo!没错,就是那个类!也正如你所见,它是一个分部类,编译器会将它们合二为一。
是不是很简单?嗯,现在,让我们在增加点难度。
在窗体里增加点内容。
<Window x:Class="Rookie_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"> <StackPanel> <TextBox x:Name="text" Text=""/> <Button x:Name="btn" Content="Click" Click="btn_Click"/> </StackPanel> </Window>
正如你所见,把<Grid></Grid>换成<StackPanel></StackPanel>,再往<StackPanel></StackPanel>里加上一个TextBox和Button。其中,Button里有一个“Click”,这就和Win Form里Click是一样一样的(其实,实现机制是不一样的)。对了,还有“x:Name”的作用就是为这个Button声明一个名为btn,类型为Button的变量。
口说无凭,让我们生成一下项目,找到生成后的exe文件,用ILSpy打开.单击展开MainWindow,
我们可以看到:
是不是与我们在“x:Name”里写的一样呢?
可能,您还有疑问:虽然声明了可又在哪创建的呢?
我们往下看,会发现有Connect这个方法。
正如您所见,这是编译器自动生成的。我们发现在这里为变量了赋值,且为Button的Click事件关联到了btn_Click方法。但还是没有回答在哪创建实例的问题,事实上是在InitializeComponent方法中调用了Application.LoadComponent()方法,这涉及到从XAML文件动态转换对象,比较复杂(我也不会^_^)。
这些只是皮毛,要继续努力!!!