Was macht InitializeComponent () und wie funktioniert es in WPF?

166

Was macht InitializeComponent()und wie funktioniert es in WPF?

Im Allgemeinen zuerst, aber ich wäre besonders interessiert, die blutigen Details der Reihenfolge der Konstruktion zu kennen und was passiert, wenn es angehängte Eigenschaften gibt.

Tim Lovell-Smith
quelle
2
Danke, ich denke das sind ziemlich gute Antworten unten! Niemand hat die AttachedProperties genau erwähnt, aber jetzt weiß ich, dass alle AttachedProperties in Xaml nur als Teil der Xaml-Analyse erstellt wurden, sodass sie keine besondere Erwähnung verdienen.
Tim Lovell-Smith

Antworten:

157

Der Aufruf von InitializeComponent()(der normalerweise im Standardkonstruktor von mindestens Windowund aufgerufen wird UserControl) ist eigentlich ein Methodenaufruf an die Teilklasse des Steuerelements (und nicht ein Aufruf der Objekthierarchie, wie ich es zuerst erwartet hatte).

Diese Methode sucht einen URI für das zu ladende Window/ an die XAML UserControlund übergibt ihn an die System.Windows.Application.LoadComponent()statische Methode. LoadComponent()Lädt die XAML-Datei, die sich am übergebenen URI befindet, und konvertiert sie in eine Instanz des Objekts, die vom Stammelement der XAML-Datei angegeben wird.

Im Detail LoadComponentwird eine Instanz von erstellt XamlParserund ein Baum der XAML erstellt. Jeder Knoten wird von der analysiert XamlParser.ProcessXamlNode(). Dies wird an die BamlRecordWriterKlasse übergeben. Einige Zeit später verliere ich mich ein wenig darin, wie die BAML in Objekte konvertiert wird, aber dies kann ausreichen, um Ihnen auf dem Weg zur Erleuchtung zu helfen.

Hinweis: Interessanterweise ist die InitializeComponenteine Methode auf der System.Windows.Markup.IComponentConnectorSchnittstelle, von denen Window/ UserControlin der Teil generierte Klasse implementieren.

Hoffe das hilft!

Brad Leach
quelle
@Brad, wie haben Sie herausgefunden, in welcher Schnittstelle InitializeComponent definiert ist? Die F1-Hilfe beim Aufruf der Datei .xaml.cs führt zu "Seite nicht gefunden", während die Datei .g.cs oder .gics zur Klasse Microsoft.SPOT.Emulator.EmulatorComponent führt. Ich bin neu bei WPF. Wird diese Methode zur Erstellungszeit generiert?
Mumm
@ АртёмЦарионов Ohne einen Aufruf von InitializeComponent im Konstruktor wird das Steuerelement in der XAML, in der es sich befindet, nicht angezeigt oder kann nicht verwendet werden.
Jason
Interessant. Ich hatte den Eindruck, dass die xaml nur während der Kompilierung verwendet wurde. Welchen Sinn hat es, die xaml zur Laufzeit verfügbar zu haben und wo wird sie gespeichert?
Jesper Matthiesen
Warum geben mir einige Methoden eine "Objektreferenz ist nicht für eine Instanz eines Objekts festgelegt". ?
Peter Gruppelaar
26

Das Betrachten des Codes hilft auch immer. Das heißt, Sie können sich die generierte Teilklasse (die LoadComponent aufruft ) wie folgt ansehen :

  1. Wechseln Sie in der Visual Studio-Lösung, an der Sie interessiert sind, zum Bereich Projektmappen-Explorer.
  2. In der Symbolleiste des Projektmappen-Explorers befindet sich eine Schaltfläche mit dem Titel "Alle Dateien anzeigen". Schalten Sie diese Schaltfläche um.
  3. Erweitern Sie nun den Ordner obj und dann den Ordner Debug oder Release (oder die von Ihnen erstellte Konfiguration), und Sie sehen eine Datei mit dem Titel YourClass .g.cs.

Die YourClass .g.cs ... ist der Code für die generierte Teilklasse. Wenn Sie das öffnen, sehen Sie erneut die InitializeComponent-Methode und wie sie LoadComponent aufruft ... und vieles mehr.

cplotts
quelle
12
Beachten Sie, dass Sie dies in einem Schritt tun können, indem Sie im Konstruktor mit der rechten Maustaste auf den Methodenaufruf klicken und "Zur Definition gehen" auswählen.
Brad Leach
2
Ah, das stimmt ... habe das vergessen. Viel einfacher so. Nun, zumindest wissen Sie, wie es im Projekt enthalten ist. Grinsen.
Plots
1
@Brad Leach, spät zu dieser Party, können Sie es mit F12
Julius Depulla