¿Qué hace InitializeComponent () y cómo funciona en WPF?

¿Qué hace InitializeComponent() y cómo funciona en WPF?

En general, primero, pero me interesaría especialmente saber los detalles sangrientos del orden de construcción y qué sucede cuando hay Propiedades Anexas.

La llamada a InitializeComponent() (que generalmente se llama en el constructor predeterminado de al menos Window y UserControl ) es en realidad una llamada de método a la clase parcial del control (en lugar de una llamada a la jerarquía de objetos como esperaba).

Este método ubica un URI en el XAML para Window / UserControl que se está cargando y lo pasa al método estático System.Windows.Application.LoadComponent() . LoadComponent() carga el archivo XAML que se encuentra en el URI pasado, y lo convierte en una instancia del objeto que se especifica mediante el elemento raíz del archivo XAML.

Más detalladamente, LoadComponent crea una instancia de XamlParser y construye un árbol de XAML. Cada nodo es analizado por XamlParser.ProcessXamlNode() . Esto se pasa a la clase BamlRecordWriter . Algún tiempo después de esto me pierdo un poco en cómo el BAML se convierte en objetos, pero esto puede ser suficiente para ayudarte en el camino hacia la iluminación.

Nota: Curiosamente, InitializeComponent es un método en la interfaz System.Windows.Markup.IComponentConnector , que Window / UserControl implementa en la clase generada parcialmente.

¡Espero que esto ayude!

Ver el código siempre ayuda también. Es decir, puedes echar un vistazo a la clase parcial generada (que llama a LoadComponent ) haciendo lo siguiente:

  1. Vaya al panel Explorador de soluciones en la solución de Visual Studio que le interese.
  2. Hay un botón en la barra de herramientas del Explorador de soluciones titulado ‘Mostrar todos los archivos’. Alternar ese botón.
  3. Ahora, expanda la carpeta obj y luego la carpeta Depurar o Liberar (o la configuración que esté construyendo) y verá un archivo titulado YourClass .g.cs.

YourClass .g.cs … es el código para la clase parcial generada. De nuevo, si abre eso, puede ver el método InitializeComponent y cómo se llama LoadComponent … y mucho más.