InitializeComponent()的作用是什么,它在WPF中如何工作?


166

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

总的来说,首先,但我特别想了解构造顺序的详细信息,以及附加属性时会发生什么。


2
谢谢,我认为这些是下面的不错的答案!没有人确切地提到AttachedProperties,但是现在我知道Xaml中的所有AttachedProperties都是作为Xaml解析的一部分创建的,因此,它们实际上并不需要特别提及。
Tim Lovell-Smith,2009年

Answers:


157

的调用InitializeComponent()(通常至少在Window和的默认构造函数中UserControl调用)实际上是对控件的部分类的方法调用(而不是像我最初期望的那样调用对象层次结构)。

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

更详细地,LoadComponent创建的实例XamlParser,并构建XAML的树。每个节点都由解析XamlParser.ProcessXamlNode()。这被传递给BamlRecordWriter班级。在此之后的一段时间,我对如何将BAML转换为对象有些迷惑,但这可能足以帮助您获得启发。

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

希望这可以帮助!


@Brad,您如何找到在哪个接口中定义InitializeComponent的?在.xaml.cs文件中调用的F1帮助导致“找不到页面”,而在.g.cs或.gics文件中的F1帮助导致Microsoft.SPOT.Emulator.EmulatorComponent类。我是WPF的新手。此方法是在构建时生成的吗?
Vimes

@АртёмЦарионов如果在构造函数中未调用InitializeComponent,则控件将不会显示或无法在其所在的XAML中使用。
杰森

有趣。我的印象是xaml仅在编译期间使用。在运行时提供xaml的意义何在?存储在何处?
Jesper Matthiesen

为什么有些方法给我一个“未在对象实例上设置对象引用”的信息。?
彼得·格鲁佩拉尔

26

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

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

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


12
请注意,您可以通过右键单击构造函数中的方法调用并选择“转到定义”来一步完成此操作。
布莱德·利奇

2
啊,没错...忘记了。这样容易得多。好吧,至少您知道它如何包含在项目中。咧嘴
cplotts

1
@Brad Leach,晚宴结束后,您可以通过F12做到这一点
Julius Depulla 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.