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

166

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

En general, primero, pero me interesaría especialmente conocer los detalles sangrientos del orden de construcción y lo que sucede cuando hay propiedades adjuntas.

Tim Lovell-Smith
fuente
2
Gracias, creo que estas son respuestas bastante buenas a continuación. Nadie mencionó exactamente las AttachedProperties, pero ahora sé que cualquier AttachedProperties en Xaml se acaba de crear como parte del análisis de Xaml, por lo que realmente no merecen una mención especial.
Tim Lovell-Smith

Respuestas:

157

La llamada a InitializeComponent()(que generalmente se llama en el constructor predeterminado de al menos Windowy 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 inicialmente).

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

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

Nota: Curiosamente, InitializeComponentes un método en la System.Windows.Markup.IComponentConnectorinterfaz, del cual Window/ UserControlimplement en la clase parcial generada.

¡Espero que esto ayude!

Brad Leach
fuente
@Brad, ¿cómo encontró en qué interfaz se define InitializeComponent? La ayuda F1 en la llamada en el archivo .xaml.cs conduce a "página no encontrada" mientras que en el archivo .g.cs o .gics conduce a la clase Microsoft.SPOT.Emulator.EmulatorComponent. Soy nuevo en WPF. ¿Se genera este método en el momento de la compilación?
Vimes
@ АртёмЦарионов Sin una llamada a InitializeComponent en el constructor, el control no se mostrará ni podrá utilizarse en el XAML en el que se encuentra.
Jason
Interesante. Tenía la impresión de que el xaml solo se usaba durante la compilación. ¿Qué sentido tiene tener el xaml disponible en tiempo de ejecución y dónde se almacena?
Jesper Matthiesen
¿Por qué algunos métodos me dan una "referencia de objeto no establecida en una instancia de un objeto"? ?
Peter Gruppelaar
26

Mirar el código siempre ayuda también. Es decir, puede 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 Debug o Release (o cualquier configuración que esté creando) y verá un archivo titulado YourClass .g.cs.

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

cplotts
fuente
12
Tenga en cuenta que puede hacer esto en un solo paso haciendo clic con el botón derecho en la llamada al método en el constructor y seleccionando "Ir a definición".
Brad Leach
2
Ah, es cierto ... se olvidó de eso. Mucho más fácil de esa manera. Bueno, al menos sabes cómo se incluye en el proyecto. Mueca.
Cplotts
1
@Brad Leach, tarde a esta fiesta, puedes hacerlo con F12
Julius Depulla