XAML背后的代码

Sun 14 July 2019 / In categories Library

WinRT, XAML

在Visual Studio (2019) 中创建一个C# UWP的Blank App(命名为App1),会自动生成两个XAML文件:

  • App.xaml
  • MainPage.xaml

其中App.xaml的内容基本为空

<Application
    x:Class="App1.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App1">

</Application>

但是上面的xaml文件指定了一个属性:x:Class="App1.App",这说明此xaml文件是和类App(App1是该类所在的命名空间)结合在一起的,或者说该xaml的部分逻辑是在App类中实现的。App类在App.xaml.cs中定义。

App类是从Windows.UI.Xaml.Application中派生出来的,其定义如下:

    sealed partial class App : Application

上面的partial 关键字说明App.xaml.cs只是部分实现了App类而已。

自动生成的类中有一个默认构造函数,不带任何参数,在这个构造函数中调用了:

            this.InitializeComponent();

这行代码会加载并初始化xaml。

另外一个xaml文件内容也很简单:

<Page
    x:Class="App1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Grid>
    </Grid>
</Page>

可以看出这个xaml是由App1.MainPage类支持的,这个类是在MainPage.xaml.cs中定义的。MainPage类继承自Windows.UI.Xaml.Controls.Page,其默认构造函数只有一行代码,就是:

            this.InitializeComponent();

用来加载MainPage.xaml。

可能你已经注意到了,App.xaml.cs以及MainPage.xaml.cs中的类都是定义为partial的。这是因为XAML编译之后会生成两个C#文件,一个是.g.cs结尾的,另一个是.g.i.cs结尾的。

以App.xaml为例,编译后生成App.xaml.g.cs和App.xaml.g.i.cs。其中App.xaml.g.i.cs定义了作为函数入口的Main(),以及加载xaml的InitializeComponent()。

(完)

Load Disqus Comments