Cenni preliminari sugli eventi di tempo
In questo argomento viene descritto come utilizzare i cinque eventi di tempo disponibili sugli oggetti Timeline e Clock.
Prerequisiti
Per capire questo argomento è necessario comprendere come creare e utilizzare le animazioni. Per informazioni introduttive sull'animazione, vedere l'argomento Cenni preliminari sull'animazione.
In WPF sono disponibili più modalità per animare le proprietà:
Utilizzo di oggetti storyboard (markup e codice): è possibile utilizzare oggetti Storyboard per disporre e distribuire animazioni a uno o più oggetti. Per un esempio, vedere Procedura: animare una proprietà utilizzando uno storyboard.
Utilizzo di animazioni locali (solo codice): è possibile applicare oggetti AnimationTimeline direttamente alle proprietà animate. Per un esempio, vedere Procedura: animare una proprietà senza utilizzare uno storyboard.
Utilizzo di orologi (solo codice): è possibile gestire in modo esplicito la creazione di orologi e distribuire direttamente gli orologi di animazione. Per un esempio, vedere Procedura: animare una proprietà utilizzando un oggetto AnimationClock.
Poiché è possibile utilizzare gli esempi di questi cenni preliminari nel markup e nel codice, in questi esempi vengono utilizzati oggetti Storyboard. Tuttavia, i concetti descritti possono essere applicati agli altri metodi di animazione delle proprietà.
Definizione di orologio
Una sequenza temporale, da sola, in realtà non fa altro che descrivere un intervallo di tempo. È l'oggetto Clock della sequenza temporale che svolge il compito effettivo, ovvero la gestione dello stato di runtime correlato al tempo per la sequenza temporale. Nella maggior parte dei casi, ad esempio in caso di utilizzo di storyboard, per una sequenza temporale viene creato automaticamente un orologio. È inoltre possibile creare un oggetto Clock in modo esplicito utilizzando il metodo CreateClock. Per ulteriori informazioni sugli oggetti Clock, vedere Cenni preliminari sull'animazione e sul sistema di temporizzazione.
Vantaggi offerti dall'utilizzo di eventi
Tutte le operazioni di tempo interattive, ad eccezione di una (ricerca allineata all'ultimo evento Tick), sono asincrone. Non è possibile sapere precisamente quando verranno eseguite. Questa condizione può costituire un problema quando è presente altro codice dipendente dall'operazione di tempo. Si supponga che sia necessario interrompere una sequenza temporale che anima un rettangolo. Dopo l'interruzione della sequenza temporale, viene modificato il colore del rettangolo.
myStoryboard.Stop(myRectangle)
' This statement might execute
' before the storyboard has stopped.
myRectangle.Fill = Brushes.Blue
myStoryboard.Stop(myRectangle);
// This statement might execute
// before the storyboard has stopped.
myRectangle.Fill = Brushes.Blue;
Nell'esempio precedente, la seconda riga di codice potrebbe essere eseguita prima dell'interruzione dello storyboard. Questa situazione si può verificare poiché l'interruzione è un'operazione asincrona. L'impostazione dell'interruzione di una sequenza temporale o di un orologio crea una "richiesta di interruzione" degli ordinamenti che non viene elaborata fino al successivo evento Tick del motore di temporizzazione.
Per eseguire i comandi dopo il completamento di una sequenza temporale, utilizzare eventi di tempo. Nell'esempio riportato di seguito viene utilizzato un gestore eventi per modificare il colore di un rettangolo dopo l’interruzione dell'esecuzione dello storyboard.
' Register for the CurrentStateInvalidated timing event.
AddHandler myStoryboard.CurrentStateInvalidated, AddressOf myStoryboard_CurrentStateInvalidated
// Register for the CurrentStateInvalidated timing event.
myStoryboard.CurrentStateInvalidated += new EventHandler(myStoryboard_CurrentStateInvalidated);
Per un esempio più esaustivo, vedere Procedura: ricevere una notifica quando uno stato dell'orologio viene modificato.
Eventi pubblici
Le classi Timeline e Clock forniscono entrambe cinque eventi di tempo. Nella tabella riportata di seguito vengono elencati questi eventi e le condizioni che li attivano.
Evento |
Operazione interattiva di attivazione |
Altri trigger |
---|---|---|
Completate |
Passaggio al riempimento |
L'orologio viene completato. |
CurrentGlobalSpeedInvalidated |
Sospensione, ripresa, ricerca, impostazione di frequenza velocità, passaggio al riempimento, interruzione |
L'orologio viene invertito, accelerato, avviato o interrotto. |
CurrentStateInvalidated |
Inizio, passaggio al riempimento, interruzione |
L'orologio viene avviato, interrotto, riempito. |
CurrentTimeInvalidated |
Inizio, ricerca, passaggio al riempimento, interruzione |
L'orologio avanza. |
RemoveRequested |
Rimozione |
Eventi Tick e consolidamento degli eventi
Quando si animano oggetti in WPF, le animazioni sono gestite dal motore di temporizzazione. Il motore di temporizzazione tiene traccia dell'avanzare del tempo e calcola lo stato di ogni animazione. In un secondo esegue numerosi passaggi di valutazione, noti come "eventi Tick".
Sebbene gli eventi Tick siano piuttosto frequenti, è possibile che tra essi avvengano vari eventi. Ad esempio, è possibile che una sequenza temporale venga interrotta, avviata e nuovamente interrotta, nel qual caso il relativo stato corrente verrà modificato tre volte. Benché in teoria l'evento potrebbe essere generato più volte in un solo Tick, gli eventi vengono consolidati dal motore di temporizzazione in modo che ogni evento possa essere generato al massimo una volta per evento Tick.
Registrazione per gli eventi
Sono due le modalità disponibili per effettuare la registrazione per eventi di tempo, con la sequenza temporale oppure con l'orologio creato dalla sequenza temporale. La registrazione per un evento direttamente con un orologio è piuttosto semplice, sebbene possa essere effettuata solo dal codice. È possibile effettuare la registrazione per gli eventi con una sequenza temporale dal markup o dal codice. Nella sezione successiva viene descritto come effettuare la registrazione per gli eventi di orologio con una sequenza temporale.
Registrazione per eventi di orologio con una sequenza temporale
Anche se gli eventi Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidated e RemoveRequested di una sequenza temporale sembrano associati alla sequenza temporale, la registrazione per tali eventi associa in effetti un gestore eventi all'oggetto Clock creato per la sequenza temporale.
Ad esempio, quando si effettua la registrazione per l'evento Completed su una sequenza temporale, si indica al sistema di effettuare la registrazione per l'evento Completed di ogni orologio creato per la sequenza temporale. Nel codice, è necessario effettuare la registrazione per l'evento prima della creazione dell'oggetto Clock per questa sequenza temporale, in caso contrario non verrà ricevuta alcuna notifica. Questa situazione si verifica automaticamente in XAML; la registrazione per l'evento viene automaticamente effettuata dal parser prima della creazione dell'oggetto Clock.
Vedere anche
Concetti
Cenni preliminari sull'animazione e sul sistema di temporizzazione