Condividi tramite


Eventi di durata degli oggetti

In questo argomento vengono descritti gli eventi WPF specifici che indicano le fasi in una durata di creazione, utilizzo e distruzione di oggetti.

Prerequisiti

In questo argomento si presuppone che si comprendano le proprietà di dipendenza dal punto di vista di un consumer di proprietà di dipendenza esistenti nelle classi Windows Presentation Foundation (WPF) e che l'argomento Cenni preliminari sulle proprietà di dipendenza sia letto. Per seguire gli esempi in questo argomento, è necessario comprendere anche XAML (vedere XAML in WPF) e sapere come scrivere applicazioni WPF.

Eventi di durata degli oggetti

Tutti gli oggetti nel codice gestito di Microsoft .NET Framework passano attraverso un set simile di fasi di vita, creazione, uso e distruzione. Per molti oggetti la fase di finalizzazione della vita si verifica nell'ambito della fase di distruzione. Gli oggetti WPF, più specificamente gli oggetti visivi identificati da WPF come elementi, hanno anche un set di fasi comuni di vita degli oggetti. I modelli di programmazione e applicazione WPF espongono queste fasi come una serie di eventi. Esistono quattro tipi principali di oggetti in WPF rispetto agli eventi di durata; elementi in generale, elementi finestra, host di navigazione e oggetti applicazione. Le finestre e gli host di navigazione fanno parte anche del più ampio raggruppamento di oggetti visivi (elementi). In questo argomento vengono descritti gli eventi di durata che sono comuni a tutti gli elementi; vengono quindi introdotti quelli più specifici che si applicano alle definizioni dell'applicazione, alle finestre o agli host di navigazione.

Eventi di durata comuni degli elementi

Qualsiasi elemento a livello di framework WPF (gli oggetti derivati da FrameworkElement o FrameworkContentElement) ha tre eventi di durata comuni: Initialized, Loadede Unloaded.

Initialized

Initialized viene generato per primo e corrisponde approssimativamente all'inizializzazione dell'oggetto dalla chiamata al relativo costruttore. Poiché l'evento si verifica in seguito all'inizializzazione, tutte le proprietà dell'oggetto sono sicuramente impostate. Un'eccezione è l'utilizzo di espressioni, ad esempio risorse dinamiche o binding, che saranno espressioni non valutate. Come conseguenza del requisito che vengono impostate tutte le proprietà, la sequenza di generazione da parte di Initialized elementi annidati definiti nel markup sembra verificarsi in ordine di elementi più profondi nell'albero degli elementi, quindi elementi padre verso la radice. Questo ordine è determinato dal fatto che le relazioni padre-figlio e il contenimento sono proprietà e pertanto l'elemento padre non può segnalare l'inizializzazione finché tutti gli elementi figlio che riempiono la proprietà non sono stati completamente inizializzati.

Quando si scrivono gestori in risposta all'evento Initialized , è necessario considerare che non esiste alcuna garanzia che tutti gli altri elementi nell'albero degli elementi (albero logico o albero visivo) intorno a dove è stato collegato il gestore, in particolare gli elementi padre. Le variabili membro potrebbero essere Null oppure le origini dati potrebbero non essere ancora popolate dall'associazione sottostante (anche a livello di espressione).

Loaded

Loaded viene generato successivamente. L'evento Loaded viene generato prima del rendering finale, ma dopo che il sistema di layout ha calcolato tutti i valori necessari per il rendering. Loaded comporta che l'albero logico in cui è contenuto un elemento è completo e si connette a un'origine di presentazione che fornisce HWND e la superficie di rendering. Il data binding standard (associazione a origini locali, ad esempio altre proprietà o origini dati definite direttamente) si è verificato prima di Loaded. È possibile che il data binding asincrono (a origini esterne o dinamiche) si sia verificato, ma a causa della sua natura asincrona non è possibile averne la certezza.

Il meccanismo in base al quale viene generato l'evento Loaded è diverso da Initialized. L'evento Initialized viene generato dall'elemento in base all'elemento, senza un coordinamento diretto da un albero degli elementi completato. Al contrario, l'evento Loaded viene generato come un'operazione coordinata nell'intero albero degli elementi (in particolare, l'albero logico). Quando tutti gli elementi dell'albero si trovano in uno stato in cui vengono considerati caricati, l'evento Loaded viene generato per la prima volta sull'elemento radice. L'evento Loaded viene quindi generato successivamente su ogni elemento figlio.

Nota

Questo comportamento potrebbe sembrare a prima vista analogo al tunneling per un evento indirizzato. Tuttavia, le informazioni non vengono passate da evento a evento. Ogni elemento ha sempre la possibilità di gestire l'evento Loaded e contrassegnare i dati dell'evento come gestiti non ha alcun effetto oltre a tale elemento.

Unloaded

Unloaded viene generato per ultimo e viene avviato dall'origine della presentazione o dall'elemento padre visivo da rimuovere. Quando Unloaded viene generato e gestito, l'elemento padre dell'origine evento (come determinato dalla Parent proprietà) o qualsiasi elemento specificato verso l'alto negli alberi logici o visivi potrebbe essere già stato unset, ovvero il data binding, i riferimenti alle risorse e gli stili potrebbero non essere impostati sul valore di runtime normale o dell'ultimo valore di runtime noto.

Elementi del modello di applicazione di eventi di durata

Basandosi sugli eventi di durata comuni per gli elementi sono gli elementi del modello di applicazione seguenti: Application, WindowPage, NavigationWindow, e Frame. Questi estendono gli eventi di durata comuni con eventi aggiuntivi, pertinenti al relativo scopo specifico e vengono descritti in dettaglio nelle sezioni seguenti:

Vedi anche