InitializeComponent()做什么,它在WPF中如何工作?

时间:2008-10-29 04:48:37

标签: c# .net wpf attached-properties

InitializeComponent()做了什么,以及它如何在WPF中起作用?

总的来说,首先,但我特别想知道构造顺序的血腥细节,以及附加属性时会发生什么。

2 个答案:

答案 0 :(得分:147)

InitializeComponent()的调用(通常在默认构造函数中至少调用WindowUserControl)实际上是对控件的partial类的方法调用(而不是按照我的预期调用对象层次结构。)

此方法将URI加载到正在加载的Window / UserControl的XAML,并将其传递给System.Windows.Application.LoadComponent()静态方法。 LoadComponent()加载位于传入的URI中的XAML文件,并将其转换为由XAML文件的根元素指定的对象的实例。

更详细地说,LoadComponent创建了XamlParser的实例,并构建了XAML的树。每个节点都由XamlParser.ProcessXamlNode()解析。这将传递给BamlRecordWriter类。在此之后的一段时间,我对BAML如何转换为对象感到有点迷失,但这可能足以帮助你走上启蒙之路。

注意:有趣的是,InitializeComponentSystem.Windows.Markup.IComponentConnector接口上的一种方法,Window / UserControl在部分生成的类中实现。

希望这有帮助!

答案 1 :(得分:22)

查看代码总是有帮助的。也就是说,您可以通过执行以下操作来实际查看生成的部分类(调用 LoadComponent ):

  1. 转到您感兴趣的Visual Studio解决方案中的“解决方案资源管理器”窗格。
  2. 解决方案资源管理器的工具栏中有一个标题为“显示所有文件”的按钮。切换该按钮。
  3. 现在,展开 obj 文件夹,然后展开调试发布文件夹(或您正在构建的任何配置),您将看到标题为 YourClass .g.cs。
  4. 的文件

    YourClass .g.cs ...是生成的分部类的代码。同样,如果你打开它,你可以看到InitializeComponent方法以及它如何调用LoadComponent ......等等。