2008-10-29 53 views
139

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

一般來說,首先,我會特別想知道構造順序的血淋淋的細節,以及當有附加屬性時會發生什麼。

+2

謝謝,我認爲這些都是相當不錯的答案!沒有人準確地提到了AttachedProperties,但現在我知道Xaml中的任何AttachedProperties都是作爲Xaml解析的一部分創建的,所以它們不值得特別提及。 – 2009-10-21 17:13:44

回答

136

InitializeComponent()呼叫(其通常被稱爲中的至少WindowUserControl默認構造)實際上是一個方法調用,以局部類的控制(而不是呼叫了對象分層結構作爲我第一預期)的。

此方法找到正在加載的Window/UserControl的XAML的URI,並將其傳遞給靜態方法System.Windows.Application.LoadComponent()LoadComponent()加載位於傳入的URI中的XAML文件,並將其轉換爲由XAML文件的根元素指定的對象的實例。

更詳細地說,LoadComponent創建了XamlParser的一個實例,並構建了XAML樹。每個節點由XamlParser.ProcessXamlNode()解析。這會傳遞給BamlRecordWriter類。在此之後的一段時間,我對BAML如何轉化爲對象感到有些迷茫,但這可能足以幫助您走上啓蒙之路。

注:有趣的是,InitializeComponentSystem.Windows.Markup.IComponentConnector接口,其中Window/UserControl在局部生成的類上實現的方法。

希望這會有所幫助!

+1

什麼是BamlRecordWriter?我無法在任何地方找到該課程...... – flq 2013-03-06 19:31:53

+0

@Brad,您是如何找到InitializeComponent在哪個接口中定義的? F1幫助.xaml.cs文件中的調用會導致「頁面未找到」,而.g.cs或.g.i.cs文件會導致Microsoft.SPOT.Emulator.EmulatorComponent類。我是WPF的新手。這個方法在構建時生成嗎? – Vimes 2013-04-19 23:37:07

20

查看代碼總是有幫助。也就是說,你其實可以看看生成的部分類(也稱LoadComponent)通過執行以下操作:

  1. 轉到在Visual Studio解決方案,你有興趣在解決方案資源管理器窗格
  2. 解決方案資源管理器的工具欄中有一個按鈕,名爲「顯示所有文件」。切換該按鈕。
  3. 現在,展開OBJ文件夾,然後調試發行文件夾(或任何配置你正在建設),你會看到標題YourClass .g.cs的文件。

The YourClass .g.cs ...是生成的部分類的代碼。同樣,如果你打開它,你可以看到InitializeComponent方法以及它如何調用LoadComponent ...以及更多。

相關問題