4

您能否从编译的角度解释 XAML 文件的生命周期?

当我构建 Silverlight 项目时,XAML 文件在构建过程中会发生什么?

4

2 回答 2

3

Jon Skeet 关于中间 .g.cs 文件的答案(现已删除,但下面引用的那部分内容)部分正确,但没有完整回答您的实际问题:

JS:构建过程的早期部分在 obj 目录中创建一个 Foo.igcs 文件,其中包含一个部分类,并以正常方式与您自己的 .cs 文件一起编译。

.g.cs 文件包含在InitialiseComponent(). 例如,这是来自基本的 MainPage.g.cs:

public void InitializeComponent() {
    ...
    System.Windows.Application.LoadComponent(this, new System.Uri("/SilverlightApp1;component/MainPage.xaml", System.UriKind.Relative));
    this.LayoutRoot = ((System.Windows.Controls.Grid)(this.FindName("LayoutRoot")));
}

这有点像为 WinForms 控件/对话框生成的设计器文件,但发生在编译时而不是设计时。

  • 编译器解析以验证 XAML 并确定需要生成哪些命名元素(到部分类中)。
  • XAML 文件本身在构建期间作为资源存储在 DLL 中(在上面的示例中,它存储为"/SilverlightApp1;component/MainPage.xaml"
  • 注意:仅对于 WPF,嵌入的 XAML 文件实际上被转换为内存效率更高的二进制版本,称为 BAML 文件。

回答您对 Jon Skeet 的评论(现已删除),您的提问部分正确:

那么解析整个 XAML 文档——所有元素、属性等——不是 WPF 或 SL 构建的一部分吗?我对么?

除了上面提到的解析之外,对于验证和命名元素,其余的解析(元素树和模板等)实际上是在运行LoadComponent()有效地反序列化 XAML 并创建您创作的元素的可视化树时完成的。

于 2012-06-10T18:52:03.503 回答
0

当您构建 Silverlight 项目时,会创建一个 .xap 文件,这基本上只是一个带有另一个扩展名的 .zip 文件,其中包含一个 AppManifest.XAML 和您的项目在一个 DLL 文件中(连同 DLL:s 用于其他依赖项)。

如果您通过 dotPeek 或 Reflector 运行 DLL,您将看到您创建的 XAML 文件在 dll 的资源中完好无损。

于 2012-06-10T18:39:29.093 回答