Cenni preliminari sull'animazione e sul sistema di temporizzazione

In questo argomento viene illustrato come il sistema di temporizzazione utilizza l'animazione, le classi Timelinee Clock per animare le proprietà.

Prerequisiti

Per la comprensione di questo argomento, è necessario essere in grado di utilizzare le animazioni WPF per animare le proprietà, come illustrato in Cenni preliminari sull'animazione. È inoltre utile conoscere le proprietà di dipendenza. Per ulteriori informazioni, vedere Cenni preliminari sulle proprietà di dipendenza.

Sequenze temporali e orologi

Nell'argomento Cenni preliminari sull'animazione viene illustrato il modo in cui un oggetto Timeline rappresenta un segmento di tempo e viene indicato che un'animazione è un tipo di Timeline che produce valori di output. Da solo un oggetto Timeline si limita a descrivere un segmento di tempo. È l'oggetto Clock della sequenza temporale a svolgere le funzioni fondamentali. L'animazione non anima le proprietà in modo vero e proprio: una classe di animazione descrive il calcolo dei valori di output, ma è l'oggetto Clock creato per l'animazione a controllare l'output di animazione e ad applicarlo alle proprietà.

Clock è un tipo speciale di oggetto che gestisce lo stato di runtime correlato alla temporizzazione per l'oggetto Timeline. Fornisce tre informazioni essenziali per l'animazione e il sistema di temporizzazione: CurrentTime, CurrentProgress e CurrentState. Un oggetto Clock consente di determinare l'ora corrente, lo stato di avanzamento e lo stato utilizzando i comportamenti di temporizzazione descritti dal relativo oggetto Timeline: Duration, RepeatBehavior, AutoReversee così via.

Nella maggior parte dei casi, un oggetto Clock viene creato automaticamente per la sequenza temporale. Quando si esegue un'animazione tramite uno Storyboard o il metodo BeginAnimation, gli orologi vengono creati automaticamente per le sequenze temporali e le animazioni e applicati alle proprietà di destinazione. È inoltre possibile creare in modo esplicito un oggetto Clock tramite il metodo CreateClock dell'oggetto Timeline. Il metodo MediaTimeline.CreateClock consente di creare un orologio del tipo appropriato per l'oggetto Timeline sul quale viene chiamato. Se l'oggetto Timeline contiene sequenze temporali figlio, vengono creati oggetti Clock anche per tali elementi figlio. Gli oggetti Clock risultanti vengono disposti in strutture ad albero corrispondenti alla struttura degli oggetti Timeline da cui vengono creati.

Esistono tipi di orologi diversi per tipi di sequenze temporali diversi. Nella tabella riportata di seguito vengono illustrati i tipi di oggetti Clock corrispondenti ad alcuni dei tipi di Timeline diversi.

Tipo di sequenza temporale

Tipi di orologio

Scopo dell'orologio

Animazione (eredita da AnimationTimeline)

AnimationClock

Genera valori di output per una proprietà di dipendenza.

MediaTimeline

MediaClock

Elabora un file multimediale.

ParallelTimeline

ClockGroup

Raggruppa e controlla gli oggetti Clock figlio

Storyboard

ClockGroup

Raggruppa e controlla gli oggetti Clock figlio

È possibile applicare qualsiasi oggetto AnimationClock creato a proprietà di dipendenza compatibili tramite il metodo ApplyAnimationClock.

Negli scenari in cui le prestazioni sono critiche, ad esempio l'animazione di un numero elevato di oggetti simili, la gestione dell'utilizzo dell'oggetto Clock può fornire vantaggi in termini di prestazioni.

Orologi e gestore del tempo

Quando si animano oggetti in WPF, il gestore del tempo gestisce gli oggetti Clock creati per le sequenze temporali. Il gestore del tempo è la radice di una struttura ad albero di oggetti Clock e controlla il flusso di tempo nella struttura. Il gestore del tempo viene creato automaticamente per ogni applicazione WPF ed è invisibile allo sviluppatore di applicazioni. Ogni secondo vengono emessi molti tick di temporizzazione. Il numero effettivo di tick emessi ogni secondo varia a seconda delle risorse di sistema disponibili. Durante ognuno di questi tick, viene calcolato lo stato di tutti gli oggetti ActiveClock nella struttura ad albero di temporizzazione.

Di seguito viene illustrata la relazione tra il gestore del tempo e AnimationClock e una proprietà di dipendenza animata.

Animazione di una proprietà

Componenti del sistema di gestione del tempo

A ogni tick viene aggiornata l'ora di ogni ActiveClock nell'applicazione. Se l'oggetto Clock è AnimationClock, utilizza il metodo GetCurrentValue dell'oggetto AnimationTimeline da cui era stato creato per calcolare il valore di output corrente. AnimationClock fornisce l'oggetto AnimationTimeline con l'ora locale corrente, un valore di input che in genere è il valore di base della proprietà e un valore di destinazione predefinito. Quando si recupera il valore di una proprietà by animata utilizzando il metodo GetValue o la relativa funzione di accesso CLR, si ottiene l'output dell'oggetto AnimationClock.

Gruppi di orologi

Nella sezione precedente è stato specificato che esistono tipi diversi di oggetti Clock per tipi diversi di sequenze temporali. Di seguito viene illustrata la relazione tra il gestore del tempo, un oggetto ClockGroup, un oggetto AnimationClock e una proprietà di dipendenza animata. Un oggetto ClockGroup viene creato per le sequenze temporali che raggruppano altre sequenze, ad esempio la classe Storyboard che raggruppa animazioni e altre sequenze temporali.

ClockGroup

Componenti del sistema di gestione del tempo

Composizione

È possibile associare più orologi a una singola proprietà, nel qual caso ogni orologio utilizza il valore di output dell'orologio precedente come relativo valore di base. Di seguito vengono illustrati tre oggetti AnimationClock applicati alla stessa proprietà. L'orologio 1 utilizza il valore di base della proprietà animata come relativo input e lo utilizza per generare l'output. L'orologio 2 accetta l'output dall'orologio 1 come relativo input e lo utilizza per generare l'output. L'orologio 3 accetta l'output dall'orologio 2 come relativo input e lo utilizza per generare l'output. Quando più orologi influiscono simultaneamente sulla stessa proprietà, formano una catena di composizione.

Una catena di composizione

Componenti del sistema di gestione del tempo

Si noti che anche se una relazione viene creata tra l'input e l'output degli oggetti AnimationClock nella catena di composizione, i relativi comportamenti di temporizzazione non subiscono alterazioni; gli oggetti Clock (inclusi gli oggetti AnimationClock) presentano una dipendenza gerarchica sugli oggetti Clock padre.

Per applicare più orologi alla stessa proprietà, utilizzare ComposeHandoffBehaviorquando si applica un oggetto Storyboard, un'animazione o AnimationClock.

Tick e consolidamento degli eventi

Oltre a calcolare i valori di output, il gestore del tempo determina lo stato di ogni orologio e genera gli eventi appropriati.

Sebbene i tick siano frequenti, è possibile che tra tali tick si verifichino numerosi eventi. Ad esempio, è possibile interrompere, avviare e nuovamente interrompere un oggetto Clock, nel qual caso il relativo valore CurrentState sarà cambiato tre volte. In teoria, l'evento CurrentStateInvalidated può essere generato in un singolo tick; il motore di temporizzazione, tuttavia, consolida eventi, in modo che l'evento CurrentStateInvalidated venga generato al massimo una volta per tick. Ciò si verifica per tutti gli eventi di temporizzazione: al massimo un evento di ogni tipo viene generato per un determinato oggetto Clock.

Quando un oggetto Clock cambia stato e torna allo stato originale tra i tick (ad esempio passa da Active a Stopped e di nuovo a Active), l'evento associato viene nuovamente generato.

Per ulteriori informazioni sugli eventi di temporizzazione, vedere Cenni preliminari sugli eventi di tempo.

Valori correnti e valori di base di proprietà

La proprietà che è possibile animare può presentare due valori: un valore di base e un valore corrente. Quando si imposta la proprietà utilizzando la relativa funzione di accesso CLR o il metodo SetValue, se ne imposta il valore di base. Quando una proprietà non è animata, i valori di base e corrente relativi sono gli stessi.

Quando si anima una proprietà, l'oggetto AnimationClock imposta il valore corrente della proprietà. Quando si recupera il valore della proprietà utilizzando la relativa funzione di accesso CLR o il metodo GetValue, viene restituito l'output dell'oggetto AnimationClock se l'oggetto AnimationClock è Active o Filling. È possibile recuperare il valore di base della proprietà utilizzando il metodo GetAnimationBaseValue.

Vedere anche

Concetti

Cenni preliminari sull'animazione

Cenni preliminari sugli eventi di tempo

Cenni preliminari sui comportamenti temporali