2008-10-29 46 views
139

¿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é ocurre cuando hay propiedades adjuntas.

+2

Gracias, creo que estas son muy buenas respuestas a continuación! Nadie mencionó exactamente las propiedades adjuntas, pero ahora sé que cualquier propiedad adjunta en Xaml se acaba de crear como parte del análisis Xaml, por lo que realmente no merecen una mención especial. –

Respuesta

136

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 hasta la jerarquía de objetos como primera esperaba) .

Este método localiza un URI en el XAML para el 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.

Con más detalle, LoadComponent crea una instancia del XamlParser y crea un árbol del 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, el InitializeComponent es un método en la interfaz System.Windows.Markup.IComponentConnector, de los cuales Window/UserControl implementar en la clase generada parcial.

Espero que esto ayude!

+1

¿Qué es un BamlRecordWriter? No puedo encontrar esa clase en ninguna parte ... – flq

+0

@Brad, ¿cómo encontraste en qué interfaz se define InitializeComponent? La ayuda de F1 en la llamada en el archivo .xaml.cs conduce a "página no encontrada" mientras que en el archivo .g.cs o .g.i.cs lleva a la clase Microsoft.SPOT.Emulator.EmulatorComponent. Soy nuevo en WPF. ¿Este método se genera en tiempo de compilación? – Vimes

+0

@ АртёмЦарионов Sin una llamada a InitializeComponent en el constructor, el control no se mostrará o se podrá utilizar en el XAML en el que se encuentra. – Jason

20

Ver el código siempre ayuda también. Esto es, en realidad se puede echar un vistazo a la clase parcial generada (que llama LoadComponent) de la siguiente manera:.

  1. Ir al panel Explorador de soluciones en la solución de Visual Studio que le interesa
  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 carpetadepuración o de lanzamiento (o lo que sea la configuración que está construyendo) y verá un archivo titulado YourClass .g.cs.

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

+12

Tenga en cuenta que puede hacer esto en un paso haciendo clic con el botón derecho en la llamada al método en el constructor y seleccionando "Ir a definición". –

+1

Ah, eso es ... se olvidó de eso. Mucho más fácil de esa manera. Bueno, al menos sabes cómo está incluido en el proyecto. Mueca. – cplotts

+1

@Brad Leach, Tarde en esta fiesta, puedes hacerlo con F12 –

Cuestiones relacionadas