InitializeComponent() 有啥作用,它在 WPF 中如何工作?
Posted
技术标签:
【中文标题】InitializeComponent() 有啥作用,它在 WPF 中如何工作?【英文标题】:What does InitializeComponent() do, and how does it work in WPF?InitializeComponent() 有什么作用,它在 WPF 中如何工作? 【发布时间】:2010-09-19 17:41:55 【问题描述】:InitializeComponent()
有什么作用,它在 WPF 中是如何工作的?
一般来说首先,但我特别想知道构造顺序的血腥细节,以及当有附加属性时会发生什么。
【问题讨论】:
谢谢,我认为下面这些是很好的答案!没有人准确地提到 AttachedProperties,但现在我知道 Xaml 中的任何 AttachedProperties 都是作为 Xaml 解析的一部分创建的,因此它们真的不值得特别提及。 【参考方案1】:对InitializeComponent()
的调用(通常在至少Window
和UserControl
的默认构造函数中调用)实际上是对控件的部分类的方法调用(而不是对对象层次结构的调用)正如我最初的预期)。
此方法为正在加载的 Window
/UserControl
定位 XAML 的 URI,并将其传递给 System.Windows.Application.LoadComponent()
静态方法。 LoadComponent()
加载位于传入 URI 处的 XAML 文件,并将其转换为由 XAML 文件的根元素指定的对象的实例。
更详细地说,LoadComponent
创建了一个XamlParser
的实例,并构建了一个 XAML 树。每个节点都由XamlParser.ProcessXamlNode()
解析。这将传递给 BamlRecordWriter
类。在此之后的一段时间,我对如何将 BAML 转换为对象有点迷失了,但这可能足以帮助您走上启蒙之路。
注意:有趣的是,InitializeComponent
是System.Windows.Markup.IComponentConnector
接口上的一个方法,其中Window
/UserControl
在部分生成的类中实现。
希望这会有所帮助!
【讨论】:
@Brad,你是怎么找到InitializeComponent定义在哪个接口的? F1 对 .xaml.cs 文件中的调用的帮助会导致“找不到页面”,而在 .g.cs 或 .g.i.cs 文件中会导致 Microsoft.SPOT.Emulator.EmulatorComponent 类。我是 WPF 的新手。这个方法是在构建时生成的吗? @АртёмЦарионов 如果没有在构造函数中调用 InitializeComponent,控件将不会在其所在的 XAML 中显示或可用。 有趣。我的印象是 xaml 仅在编译期间使用。. 让 xaml 在运行时可用以及它存储在哪里有什么意义? 为什么有些方法给我一个“对象引用没有在对象的实例上设置”。 ? @JesperMatthiesen 也许是为了热重载?因此,在调试期间对 XAML 的更改会在运行时反映出来,而无需重新启动/重新编译应用程序。【参考方案2】:查看代码也总是有帮助。也就是说,您实际上可以通过执行以下操作来查看生成的部分类(调用 LoadComponent):
-
转到您感兴趣的 Visual Studio 解决方案中的“解决方案资源管理器”窗格。
解决方案资源管理器的工具栏中有一个标题为“显示所有文件”的按钮。切换该按钮。
现在,展开 obj 文件夹,然后展开 Debug 或 Release 文件夹(或您正在构建的任何配置),您将看到一个标题为 YourClass.g.cs. 的文件
YourClass.g.cs ...是生成的部分类的代码。同样,如果您打开它,您可以看到 InitializeComponent 方法以及它如何调用 LoadComponent ...等等。
【讨论】:
请注意,您可以通过右键单击构造函数中的方法调用并选择“转到定义”来一步完成。 啊,没错……忘记了。这样容易多了。好吧,至少您知道它是如何包含在项目中的。咧嘴一笑。 @Brad Leach,这个派对迟到了,你可以用 F12 来做以上是关于InitializeComponent() 有啥作用,它在 WPF 中如何工作?的主要内容,如果未能解决你的问题,请参考以下文章
InitializeComponent()的非常简单的定义;方法
InitializeComponent 在两个构造函数中,还是在一个构造函数继承中?