web-dev-qa-db-fra.com

Que fait InitializeComponent () et comment fonctionne-t-il 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 qu'il se passe lorsqu'il y a des propriétés attachées.

152
Tim Lovell-Smith

L'appel à InitializeComponent() (généralement appelé dans le constructeur par défaut d'au moins Window et UserControl) est en fait un appel de méthode à la classe partielle du contrôle (plutôt d’appeler la hiérarchie d’objets comme je l’espérais au départ).

Cette méthode localise un URI vers le XAML pour le Window/UserControl en cours de chargement et le transmet à la méthode System.Windows.Application.LoadComponent() statique. LoadComponent() charge le fichier XAML situé dans l'URI transmis 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 crée un arbre du XAML. Chaque nœud est analysé par le XamlParser.ProcessXamlNode(). Ceci est passé à la classe BamlRecordWriter. Quelque temps après, je suis un peu perdu dans la conversion du BAML en objets, mais cela peut suffire à vous aider sur le chemin de l'illumination.

Note: Fait intéressant, le InitializeComponent est une méthode sur le System.Windows.Markup.IComponentConnector interface, dont Window/UserControl implémente dans la classe générée partielle.

J'espère que cela t'aides!

148
Brad Leach

Regarder le code aide toujours aussi. En d’autres termes, vous pouvez réellement examiner la classe partielle générée (qui appelle LoadComponent) en procédant comme suit:

  1. Accédez au volet Explorateur de solutions de la solution Visual Studio qui vous intéresse.
  2. La barre d’outils de l’explorateur de solutions contient un bouton intitulé "Afficher tous les fichiers". Basculez ce bouton.
  3. Maintenant, développez le dossier obj puis le dossier Debug ou Release (ou la configuration que vous construisez) et vous verrez un fichier intitulé YourClass . G.cs.

Le YourClass . G.cs ... est le code de 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.

22
cplotts