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文件动态转换对象,比较复杂(我也不会^_^)。

   这些只是皮毛,要继续努力!!!

 

posted @ 2012-09-22 18:43  Lyon Gu  阅读(1308)  评论(1编辑  收藏  举报