Cenni preliminari sugli eventi di tempo

In questo argomento viene descritto come utilizzare i cinque eventi di intervallo disponibili per Timeline gli oggetti e Clock .

Prerequisiti

Per comprendere questo argomento è necessario sapere come creare e usare le animazioni. Per informazioni introduttive sull'animazione, vedere i Cenni preliminari sull'animazione.

Esistono diversi modi per animare le proprietà in WPF:

Poiché è possibile usarli nel markup e nel codice, gli esempi in questa panoramica usano Storyboard gli oggetti . I concetti descritti possono tuttavia essere applicati ad altri metodi di animazione delle proprietà.

Che cos'è un orologio?

Una sequenza temporale, da sola, in realtà non fa altro che descrivere un intervallo di tempo. Si tratta dell'oggetto della Clock sequenza temporale che esegue il lavoro reale: mantiene lo stato di runtime correlato alla tempistica per la sequenza temporale. Nella maggior parte dei casi, ad esempio quando si usano gli storyboard, viene creato automaticamente un orologio per la sequenza temporale. È anche possibile creare un oggetto Clock in modo esplicito usando il CreateClock metodo . Per altre informazioni sugli Clock oggetti, vedere Cenni preliminari sul sistema di animazione e temporizzazione.

Perché usare gli eventi?

Fatta eccezione di una (ricerca allineata all'ultimo tick), tutte le operazioni di tempo interattive sono asincrone. Non è possibile sapere esattamente quando verranno eseguite. Questo può essere un problema quando è presente altro codice dipendente dall'operazione di tempo. Si supponga che si desidera interrompere una sequenza temporale che ha aggiunto un'animazione a 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. Ciò avviene perché l'interruzione è un'operazione asincrona. L'indicazione per l'interruzione di una sequenza temporale o di un orologio crea una "richiesta di interruzione" di ordinamenti che non viene elaborata fino al tick successivo del motore di temporizzazione.

Per eseguire i comandi dopo il completamento di una sequenza temporale, usare gli eventi di tempo. Nell'esempio seguente, un gestore eventi viene usato per modificare il colore di un rettangolo dopo l'interruzione della riproduzione dello storyboard.

// Register for the CurrentStateInvalidated timing event.
myStoryboard.CurrentStateInvalidated += new EventHandler(myStoryboard_CurrentStateInvalidated);
' Register for the CurrentStateInvalidated timing event.
AddHandler myStoryboard.CurrentStateInvalidated, AddressOf myStoryboard_CurrentStateInvalidated
// Change the rectangle's color after the storyboard stops.
void myStoryboard_CurrentStateInvalidated(object sender, EventArgs e)
{
    Clock myStoryboardClock = (Clock)sender;
    if (myStoryboardClock.CurrentState == ClockState.Stopped)
    {
        myRectangle.Fill = Brushes.Blue;
    }
}
' Change the rectangle's color after the storyboard stops. 
Private Sub myStoryboard_CurrentStateInvalidated(ByVal sender As Object, ByVal e As EventArgs)
    Dim myStoryboardClock As Clock = CType(sender, Clock)
    If myStoryboardClock.CurrentState = ClockState.Stopped Then
        myRectangle.Fill = Brushes.Blue
    End If
End Sub

Per un esempio più complesso, vedere Ricevere una notifica quando uno stato dell'orologio viene modificato.

Eventi pubblici

Le Timeline classi e Clock forniscono entrambi cinque eventi di intervallo. Nella tabella seguente sono elencati questi eventi e le condizioni che li attivano.

Evento Operazione interattiva di attivazione Altri trigger
Completato 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 Remove

Tick e consolidamento degli eventi

Quando si animano gli oggetti in WPF, si tratta del motore di temporizzazione che gestisce le animazioni. Il motore di temporizzazione tiene traccia dell'avanzamento del tempo e calcola lo stato di ogni animazione. Esegue numerosi passaggi di valutazione in un secondo. Questi passaggi di valutazione sono noti come "tick".

Sebbene gli eventi tick siano piuttosto frequenti, è possibile che tra essi avvengano vari eventi. Una sequenza temporale può essere ad esempio interrotta, avviata e interrotta nuovamente, nel qual caso lo stato corrente verrà cambiato tre volte. In teoria l'evento può essere generato più volte in un singolo tick. Il motore di temporizzazione consolida tuttavia gli eventi in modo che ogni evento possa essere generato al massimo una volta per tick.

Registrazione per gli eventi

Esistono due modi per registrarsi per gli eventi di tempo: è possibile registrarsi con la sequenza temporale o con l'orologio creato dalla sequenza temporale. La registrazione per un evento direttamente con un orologio è piuttosto semplice, anche se può essere eseguita solo dal codice. È possibile registrarsi per gli eventi con una sequenza temporale dal codice o dal markup. La sezione successiva descrive come registrarsi per gli eventi di orologio con una sequenza temporale.

Registrazione per gli eventi di orologio con una sequenza temporale

Anche se gli eventi , , , e di una sequenza temporale sembrano essere associati alla sequenza temporale, la registrazione per questi eventi associa effettivamente un gestore eventi all'oggetto Clock creato per la sequenza temporale.CompletedRemoveRequestedCurrentTimeInvalidatedCurrentStateInvalidatedCurrentGlobalSpeedInvalidated

Quando si esegue la registrazione per l'evento Completed in una sequenza temporale, ad esempio, si indica al sistema di registrarsi per l'evento Completed di ogni orologio creato per la sequenza temporale. Nel codice è necessario registrarsi per questo evento prima Clock che venga creato per questa sequenza temporale. In caso contrario, non si riceverà alcuna notifica. Questo avviene automaticamente in XAML; il parser esegue automaticamente la registrazione per l'evento prima della creazione di Clock .

Vedi anche