Cenni preliminari sugli eventi di tempoTiming Events Overview

In questo argomento viene descritto come utilizzare i cinque eventi di temporizzazione disponibili in Timeline e Clock oggetti.This topic describes how to use the five timing events available on Timeline and Clock objects.

PrerequisitiPrerequisites

Per comprendere questo argomento è necessario sapere come creare e usare le animazioni.To understand this topic, you should understand how to create and use animations. Per iniziare con animazione, vedere il panoramica dell'animazione.To get started with animation, see the Animation Overview.

Esistono diversi modi per applicare l'animazione in WPFWPF:There are multiple ways to animate properties in WPFWPF:

Poiché è possibile utilizzare nel markup e codice, utilizzano gli esempi in questa panoramica Storyboard oggetti.Because you can use them in markup and code, the examples in this overview use Storyboard objects. I concetti descritti possono tuttavia essere applicati ad altri metodi di animazione delle proprietà.However, the concepts described can be applied to the other methods of animating properties.

Che cos'è un orologio?What is a clock?

Una sequenza temporale, da sola, in realtà non fa altro che descrivere un intervallo di tempo.A timeline, by itself, doesn't actually do anything other than describe a segment of time. È la sequenza temporale Clock oggetto che esegue il lavoro effettivo: gestisce lo stato di runtime correlati alla temporizzazione per la sequenza temporale.It's the timeline's Clock object that does the real work: it maintains timing-related run-time state for the timeline. Nella maggior parte dei casi, ad esempio quando si usano gli storyboard, viene creato automaticamente un orologio per la sequenza temporale.In most cases, such as when using storyboards, a clock is created automatically for your timeline. È inoltre possibile creare un Clock in modo esplicito utilizzando il CreateClock metodo.You can also create a Clock explicitly by using the CreateClock method. Per ulteriori informazioni su Clock degli oggetti, vedere il animazione e temporizzazione System Overview.For more information about Clock objects, see the Animation and Timing System Overview.

Perché usare gli eventi?Why Use Events?

Fatta eccezione di una (ricerca allineata all'ultimo tick), tutte le operazioni di tempo interattive sono asincrone.With the exception of one (seek aligned to last tick), all interactive timing operations are asynchronous. Non è possibile sapere esattamente quando verranno eseguite.There is no way for you to know exactly when they will execute. Questo può essere un problema quando è presente altro codice dipendente dall'operazione di tempo.That can be a problem when you have other code that's dependent upon your timing operation. Si supponga che si desidera interrompere una sequenza temporale che ha aggiunto un'animazione a un rettangolo.Suppose that you wanted to stop a timeline that animated a rectangle. Dopo l'interruzione della sequenza temporale, viene modificato il colore del rettangolo.After the timeline stops, you change the color of the rectangle.

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.In the previous example, the second line of code might execute before the storyboard stops. Ciò avviene perché l'interruzione è un'operazione asincrona.That's because stopping is an asynchronous operation. 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.Telling a timeline or clock to stop creates a "stop request" of sorts that isn't processed until the timing engine's next tick.

Per eseguire i comandi dopo il completamento di una sequenza temporale, usare gli eventi di tempo.To execute commands after a timeline completes, use timing events. Nell'esempio seguente, un gestore eventi viene usato per modificare il colore di un rettangolo dopo l'interruzione della riproduzione dello storyboard.In the following example, an event handler is used to change the color of a rectangle after the storyboard stops playing.

// 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ù esaustivo, vedere le modifiche dello stato di ricevere notifica quando un Clock.For a more complete example, see Receive Notification When a Clock's State Changes.

Eventi pubbliciPublic Events

Il Timeline e Clock classi forniscono entrambe cinque eventi di temporizzazione.The Timeline and Clock classes both provide five timing events. Nella tabella seguente sono elencati questi eventi e le condizioni che li attivano.The following table lists these events and the conditions that trigger them.

eventEvent Operazione interattiva di attivazioneTriggering interactive operation Altri triggerOther triggers
CompletedCompleted Passaggio al riempimentoSkip to fill L'orologio viene completato.The clock completes.
CurrentGlobalSpeedInvalidatedCurrentGlobalSpeedInvalidated Sospensione, ripresa, ricerca, impostazione di frequenza velocità, passaggio al riempimento, interruzionePause, resume, seek, set speed ratio, skip to fill, stop L'orologio viene invertito, accelerato, avviato o interrotto.The clock reverses, accelerates, starts, or stops.
CurrentStateInvalidatedCurrentStateInvalidated Inizio, passaggio al riempimento, interruzioneBegin, skip to fill, stop L'orologio viene avviato, interrotto, riempito.The clock starts, stops, or fills.
CurrentTimeInvalidatedCurrentTimeInvalidated Inizio, ricerca, passaggio al riempimento, interruzioneBegin, seek, skip to fill, stop L'orologio avanza.The clock progresses.
RemoveRequestedRemoveRequested RimuoviRemove

Tick e consolidamento degli eventiTicking and Event Consolidation

Quando si aggiunge un'animazione oggetti WPFWPF, è il motore di temporizzazione che gestisce le animazioni.When you animate objects in WPFWPF, it’s the timing engine that manages your animations. Il motore di temporizzazione tiene traccia dell'avanzamento del tempo e calcola lo stato di ogni animazione.The timing engine tracks the progression of time and computes the state of each animation. Esegue numerosi passaggi di valutazione in un secondo.It makes many such evaluation passes in a second. Questi passaggi di valutazione sono noti come "tick".These evaluation passes are known as "ticks."

Sebbene gli eventi tick siano piuttosto frequenti, è possibile che tra essi avvengano vari eventi.While ticks occur frequently, it's possible for a lot of things to happen between ticks. Una sequenza temporale può essere ad esempio interrotta, avviata e interrotta nuovamente, nel qual caso lo stato corrente verrà cambiato tre volte.For example, a timeline might be stopped, started, and stopped again, in which case its current state will have changed three times. 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.In theory, the event could be raised multiple times in a single tick; however, the timing engine consolidates events, so that each event can be raised at most once per tick.

Registrazione per gli eventiRegistering for Events

Esistono due modi per registrarsi per gli eventi di tempo: è possibile registrarsi con la sequenza temporale o con l'orologio creato dalla sequenza temporale.There are two ways to register for timing events: you can register with the timeline or with the clock created from the timeline. La registrazione per un evento direttamente con un orologio è piuttosto semplice, anche se può essere eseguita solo dal codice.Registering for an event directly with a clock is fairly straightforward, although it can only be done from code. È possibile registrarsi per gli eventi con una sequenza temporale dal codice o dal markup.You can register for events with a timeline from markup or code. La sezione successiva descrive come registrarsi per gli eventi di orologio con una sequenza temporale.The next section describes how to register for clock events with a timeline.

Registrazione per gli eventi di orologio con una sequenza temporaleRegistering for Clock Events with a Timeline

Anche se una sequenza temporale Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidated, e RemoveRequested sembrano essere associati alla sequenza temporale, la registrazione per questi eventi effettivamente associa un gestore eventi con eventi di Clock creato per la sequenza temporale.Although a timeline's Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidated, and RemoveRequested events appear to be associated with the timeline, registering for these events actually associates an event handler with the Clock created for the timeline.

Quando si registra per il Completed evento in una sequenza temporale, ad esempio, si indica al sistema di registrazione per il Completed evento di ogni orologio creato per la sequenza temporale.When you register for the Completed event on a timeline, for example, you're actually telling the system to register for the Completed event of each clock that is created for the timeline. Nel codice, è necessario registrare questo evento prima di Clock viene creato per questa sequenza temporale; in caso contrario, si riceverà la notifica.In code, you must register for this event before the Clock is created for this timeline; otherwise, you won't receive notification. Questo errore si verifica automaticamente in XAMLXAML; il parser registra automaticamente per l'evento prima di Clock viene creato.This happens automatically in XAMLXAML; the parser automatically registers for the event before the Clock is created.

Vedere ancheSee Also

Cenni preliminari sull'animazione e sul sistema di temporizzazioneAnimation and Timing System Overview
Cenni preliminari sull'animazioneAnimation Overview
Cenni preliminari sui comportamenti temporaliTiming Behaviors Overview