2008-10-29 5 views
139

Que fait InitializeComponent(), et comment ça marche dans WPF?Que fait InitializeComponent() et comment fonctionne-t-il dans WPF?

En général d'abord, mais je serais particulièrement intéressé de connaître les détails sanglants de l'ordre de construction, et ce qui se passe quand il y a des propriétés attachées.

+2

Merci, je pense que ce sont de très bonnes réponses ci-dessous! Personne n'a mentionné les AttachedProperties exactement, mais maintenant je sais que toutes les AttachedProperties dans Xaml sont juste créées dans le cadre de l'analyse Xaml, donc elles ne méritent pas vraiment une mention spéciale. –

Répondre

136

L'appel à InitializeComponent() (qui est généralement appelée dans le constructeur par défaut d'au moins Window et UserControl) est en fait un appel de méthode à la classe partielle de la commande (au lieu d'un appel dans la hiérarchie de l'objet comme je premier attendu) .

Cette méthode localise une adresse URI vers le code XAML pour le Window/UserControl en cours de chargement et la transmet à la méthode statique System.Windows.Application.LoadComponent(). LoadComponent() charge le fichier XAML situé à l'adresse URI transmise et le convertit en une instance de l'objet spécifié par l'élément racine du fichier XAML.

Plus en détail, LoadComponent crée une instance du XamlParser et génère un arbre du code XAML. Chaque nœud est analysé par le XamlParser.ProcessXamlNode(). Ceci est passé à la classe BamlRecordWriter. Quelque temps après cela, je me perds un peu dans la façon dont le BAML est converti en objets, mais cela peut suffire à vous aider sur le chemin de l'illumination.

Note: Il est intéressant de la InitializeComponent est un procédé à l'interface System.Windows.Markup.IComponentConnector dont Window/UserControl mettre en œuvre dans la classe générée partielle.

Espérons que cela aide!

+1

Qu'est-ce qu'un BamlRecordWriter? Je ne trouve pas cette classe nulle part ... – flq

+0

@Brad, comment avez-vous trouvé l'interface dans laquelle InitializeComponent est défini? L'aide F1 sur l'appel dans le fichier .xaml.cs conduit conduit à «page introuvable» tandis que dans le fichier .g.cs ou .g.i.cs conduit à la classe Microsoft.SPOT.Emulator.EmulatorComponent. Je suis nouveau à WPF. Cette méthode est-elle générée au moment de la construction? – Vimes

+0

@ АртёмЦарионов Sans appel à InitializeComponent dans le constructeur, le contrôle ne sera pas affiché ou utilisable dans le code XAML dans lequel il se trouve. – Jason

20

En regardant le code aide toujours aussi. Autrement dit, vous pouvez réellement jeter un oeil à la classe partielle générée (qui appelle LoadComponent) en procédant comme suit:.

  1. Allez dans le volet Explorateur de solutions dans la solution Visual Studio que vous êtes intéressé par
  2. Il y a un bouton dans la barre d'outils de l'Explorateur de solutions intitulé «Afficher tous les fichiers». Basculer ce bouton.
  3. Maintenant, développez le dossier obj puis le débogage ou dossier de presse (ou quelle que soit la configuration que vous construisez) et vous verrez un fichier intitulé YourClass .g.cs.

Le YourClass .g.cs ... est le code pour la classe partielle générée. Encore une fois, si vous l'ouvrez, vous pouvez voir la méthode InitializeComponent et comment elle appelle LoadComponent ... et bien plus encore.

+12

Notez que vous pouvez le faire en une étape en cliquant avec le bouton droit sur l'appel de méthode dans le constructeur et en sélectionnant "Aller à la définition". –

+1

Ah, c'est vrai ... j'ai oublié ça. Beaucoup plus facile de cette façon. Eh bien, au moins vous savez comment cela est inclus dans le projet. Sourire. – cplotts

+1

@Brad Leach, tard à cette fête, vous pouvez le faire avec F12 –