Cosa fa InitializeComponent () e come funziona in WPF?


166

Cosa fa InitializeComponent()e come funziona in WPF?

In generale prima, ma sarei particolarmente interessato a conoscere i dettagli cruenti dell'ordine di costruzione e cosa succede quando ci sono Proprietà associate.


2
Grazie, penso che queste siano risposte piuttosto buone qui sotto! Nessuno ha menzionato esattamente AttachedProperties, ma ora so che qualsiasi AttachedProperties in Xaml è stato appena creato come parte dell'analisi Xaml, quindi non meritano davvero una menzione speciale.
Tim Lovell-Smith,

Risposte:


157

La chiamata a InitializeComponent()(che di solito viene chiamata nel costruttore predefinito di almeno Windowe UserControl) è in realtà una chiamata di metodo alla classe parziale del controllo (piuttosto che una chiamata alla gerarchia degli oggetti come mi aspettavo per la prima volta).

Questo metodo individua un URI in XAML per il Window/ UserControlche sta caricando e lo passa al System.Windows.Application.LoadComponent()metodo statico. LoadComponent()carica il file XAML che si trova nell'URI passato e lo converte in un'istanza dell'oggetto specificato dall'elemento root del file XAML.

Più in dettaglio, LoadComponentcrea un'istanza di XamlParsere crea un albero di XAML. Ogni nodo è analizzato dal XamlParser.ProcessXamlNode(). Questo viene passato alla BamlRecordWriterclasse. Qualche tempo dopo mi perdo un po 'nel modo in cui la BAML viene convertita in oggetti, ma questo potrebbe essere sufficiente per aiutarti nel percorso verso l'illuminazione.

Nota: è interessante notare che InitializeComponentè un metodo System.Windows.Markup.IComponentConnectorsull'interfaccia, di cui Window/ UserControlimplementa nella classe generata parzialmente.

Spero che questo ti aiuti!


@Brad, come hai trovato in quale interfaccia è stato definito InitializeComponent? La guida F1 sulla chiamata nel file .xaml.cs porta alla "pagina non trovata" mentre nel file .g.cs o .gics porta alla classe Microsoft.SPOT.Emulator.EmulatorComponent. Sono nuovo di WPF. Questo metodo viene generato al momento della creazione?
Vimes,

@ АртёмЦарионов Senza una chiamata a InitializeComponent nel costruttore, il controllo non verrà visualizzato o non sarà utilizzabile nell'XAML in cui si trova.
Jason,

Interessante. Avevo l'impressione che lo xaml fosse usato solo durante la compilazione. Che senso ha lo xaml disponibile in fase di esecuzione e dove è archiviato?
Jesper Matthiesen,

Perché alcuni metodi mi danno un "riferimento all'oggetto non impostato su un'istanza di un oggetto". ?
Peter Gruppelaar,

26

Anche guardare il codice aiuta sempre. Cioè, puoi effettivamente dare un'occhiata alla classe parziale generata (che chiama LoadComponent ) nel modo seguente:

  1. Vai al riquadro Esplora soluzioni nella soluzione di Visual Studio che ti interessa.
  2. Nella barra degli strumenti di Solution Explorer è presente un pulsante intitolato "Mostra tutti i file". Attiva quel pulsante.
  3. Ora espandi la cartella obj e poi la cartella Debug o Release (o qualunque configurazione tu stia creando) e vedrai un file intitolato YourClass .g.cs.

I YourClass .g.cs ... è il codice di classe parziale generato. Ancora una volta, se lo apri puoi vedere il metodo InitializeComponent e come chiama LoadComponent ... e molto altro.


12
Nota che puoi farlo in un solo passaggio facendo clic con il tasto destro del mouse sulla chiamata del metodo nel costruttore e selezionando "Vai a definizione".
Brad Leach,

2
Ah, è vero ... me ne sono dimenticato. Molto più facile in questo modo. Bene, almeno sai come è incluso nel progetto. Sorriso.
cplotts,

1
@Brad Leach, in ritardo a questa festa, puoi farlo con F12
Julius Depulla il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.