Que fait InitializeComponent()
et comment ça marche 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.
Que fait InitializeComponent()
et comment ça marche 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.
Réponses:
L'appel à InitializeComponent()
(qui est 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 qu'un appel à la hiérarchie d'objets comme je m'y attendais au départ).
Cette méthode localise un URI vers le XAML pour le Window
/ UserControl
qui est en cours de chargement et le transmet à la System.Windows.Application.LoadComponent()
méthode statique. LoadComponent()
charge le fichier XAML qui se trouve au niveau de l'URI passé 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 construit une arborescence du XAML. Chaque nœud est analysé par le XamlParser.ProcessXamlNode()
. Cela est transmis à la BamlRecordWriter
classe. 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.
Remarque: Il InitializeComponent
est intéressant de noter que le est une méthode sur l' 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!
Regarder le code aide toujours aussi. Autrement dit, vous pouvez réellement jeter un œil à la classe partielle générée (qui appelle LoadComponent ) en procédant comme suit:
Les YourClass .g.cs ... est le code de produit classe partielle. Encore une fois, si vous ouvrez cela, vous pouvez voir la méthode InitializeComponent et comment elle appelle LoadComponent ... et bien plus encore.