Dela via


Översikt över animerings- och tidsschemasystem

I det här avsnittet beskrivs hur tidsschemat använder animeringen, Timelineoch Clock klasser för att animera egenskaper.

Förutsättningar

För att förstå det här avsnittet bör du kunna använda WPF-animeringar för att animera egenskaper, enligt beskrivningen i översikten över animering. Det hjälper också till att känna till beroendeegenskaper. Mer information finns i översikten över beroendeegenskaper.

Tidslinjer och klockor

Översikten över animeringen beskriver hur en Timeline representerar ett tidssegment och en animering är en form av Timeline som genererar utdatavärden. I sig gör en Timelineinte något annat än att bara beskriva ett tidssegment. Det är tidslinjens Clock objekt som utför det verkliga arbetet. På samma sätt animerar animeringen inte egenskaper: en animeringsklass beskriver hur utdatavärden ska beräknas, men det är den Clock som skapades för animeringen som driver animeringens utdata och tillämpar dem på egenskaper.

En Clock är en särskild typ av objekt som upprätthåller tidsrelaterat körningstillstånd för Timeline. Den innehåller tre bitar information som är viktig för animerings- och tidsschemat: CurrentTime, CurrentProgressoch CurrentState. En Clock avgör dess aktuella tid, förlopp och tillstånd med hjälp av de tidsbeteenden som beskrivs i dess Timeline: Duration, RepeatBehavior, AutoReverseoch så vidare.

I de flesta fall skapas en Clock automatiskt för din tidslinje. När du animerar med hjälp av en Storyboard eller metoden BeginAnimation skapas klockor automatiskt för dina tidslinjer och animeringar och tillämpas på deras målegenskaper. Du kan också skapa en Clock explicit med hjälp av CreateClock-metoden för din Timeline. Metoden MediaTimeline.CreateClock skapar en klocka av lämplig typ för den Timeline som den anropas på. Om Timeline innehåller underordnade tidslinjer, skapar det även Clock-objekt för dem. De resulterande Clock objekten ordnas i träd som matchar strukturen för det Timeline objektträd som de skapas från.

Det finns olika typer av klockor för olika typer av tidslinjer. I följande tabell visas de Clock typer som motsvarar några av de olika Timeline typerna.

Tidslinjetyp Klocktyp Klockans syfte
Animering (ärver från AnimationTimeline) AnimationClock Genererar utdatavärden för en beroendeegenskap.
MediaTimeline MediaClock Bearbetar en mediefil.
ParallelTimeline ClockGroup Grupperar och styr dess underordnade Clock objekt
Storyboard ClockGroup Grupperar och styr dess underordnade Clock objekt

Du kan använda alla AnimationClock objekt som du skapar för kompatibla beroendeegenskaper med hjälp av metoden ApplyAnimationClock.

I prestandaintensiva scenarier, som att animera ett stort antal liknande objekt, kan det ge prestandafördelar genom att hantera användningen av Clock själv.

Klockor och Tidshanteraren

När du animerar objekt i WPF är det tidshanteraren som hanterar Clock objekt som skapats för dina tidslinjer. Tidshanteraren är roten i ett träd med Clock objekt och styr tidsflödet i trädet. En tidshanterare skapas automatiskt för varje WPF-program och är osynlig för programutvecklaren. Tidshanteraren "tickar" många gånger per sekund; det faktiska antalet tick som inträffar varje sekund varierar beroende på tillgängliga systemresurser. Under var och en av dessa tick beräknar tidshanteraren tillståndet för alla ActiveClock objekt i tidsträdet.

Följande bild visar relationen mellan tidshanteraren och AnimationClockoch en animerad beroendeegenskap.

Tidsschemasystemkomponenter och tidshanteraren.
Animera en egenskap

När tidshanteraren tickar uppdateras tiden för varje ActiveClock i programmet. Om Clock är en AnimationClockanvänder den GetCurrentValue-metoden för den AnimationTimeline som den skapades från för att beräkna dess aktuella utdatavärde. AnimationClock tillhandahåller AnimationTimeline med den aktuella lokala tiden, ett indatavärde, som vanligtvis är basvärdet för egenskapen och ett standardmålvärde. När du hämtar värdet för en animerad egenskap med hjälp av metoden GetValue eller dess CLR-accessor får du resultatet av dess AnimationClock.

Klockgrupper

I föregående avsnitt beskrivs hur det finns olika typer av Clock objekt för olika typer av tidslinjer. Följande bild visar relationen mellan tidshanteraren, en ClockGroup, en AnimationClockoch en animerad beroendeegenskap. En ClockGroup skapas för tidslinjer som grupperar andra tidslinjer, till exempel klassen Storyboard, som grupperar animeringar och andra tidslinjer.

Systemkomponenter för tidsinställningar med tidshanteraren och beroendeegenskaperna.
En klockgrupp

Sammansättning

Det är möjligt att associera flera klockor med en enda egenskap, i vilket fall varje klocka använder utdatavärdet för föregående klocka som basvärde. Följande bild visar tre AnimationClock objekt som tillämpas på samma egenskap. Clock1 använder basvärdet för den animerade egenskapen som indata och använder den för att generera utdata. Clock2 tar utdata från Clock1 som indata och använder den för att generera utdata. Clock3 tar utdata från Clock2 som indata och använder den för att generera utdata. När flera klockor påverkar samma egenskap samtidigt, sägs de vara i en kompositionskedja.

Tidsmätningssystemkomponenter som består av flera beroende egenskaper.
En kompositionskedja

Observera att även om en relation skapas mellan indata och utdata för de AnimationClock objekten i kompositionskedjan påverkas inte deras tidsbeteenden. Clock objekt (inklusive AnimationClock objekt) har ett hierarkiskt beroende av sina överordnade Clock objekt.

Om du vill använda flera klockor på samma egenskap använder du ComposeHandoffBehavior när du använder en Storyboard, animering eller AnimationClock.

Fästingar och händelsekonsolidering

Förutom att beräkna utdatavärden utför tidshanteraren annat arbete varje gång det tickar: det avgör tillståndet för varje klocka och genererar händelser efter behov.

Även om fästingar förekommer ofta är det möjligt för många saker att hända mellan fästingar. Ett Clock kan till exempel stoppas, startas och stoppas igen, i vilket fall dess CurrentState värde har ändrats tre gånger. I teorin kan CurrentStateInvalidated-händelsen utlösas flera gånger under ett enda tidscykel; tidsmotorn konsoliderar dock händelser så att CurrentStateInvalidated-händelsen kan aktiveras högst en gång per tidscykel. Detta gäller för alla tidshändelser: högst en händelse av varje typ genereras för en viss Clock objekt.

När en Clock växlar tillstånd och återgår till sitt ursprungliga tillstånd mellan tidsögonblick (såsom att ändra från Active till Stopped och tillbaka till Active) inträffar fortfarande den associerade händelsen.

För mer information om tidsanpassade händelser, se översikten över tidsanpassade händelser.

Aktuella värden och basvärden för egenskaper

En animatable-egenskap kan ha två värden: ett basvärde och ett aktuellt värde. När du anger egenskapen med dess CLR-accessor eller metoden SetValue anger du dess basvärde. När en egenskap inte är animerad är dess bas och aktuella värden desamma.

När du animerar en egenskap anger AnimationClock egenskapens aktuella värde. Om du hämtar egenskapens värde via dess CLR-accessor eller GetValue-metoden returneras utdata från AnimationClock när AnimationClock är Active eller Filling. Du kan hämta egenskapens basvärde med hjälp av metoden GetAnimationBaseValue.

Se även