Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit onderwerp wordt beschreven hoe het timingsysteem gebruikmaakt van de klassen animatie, Timelineen Clock om eigenschappen te animeren.
Voorwaarden
Als u dit onderwerp wilt begrijpen, moet u WPF-animaties kunnen gebruiken om eigenschappen te animeren, zoals beschreven in het Animatieoverzicht. Het helpt ook vertrouwd te zijn met afhankelijkheidseigenschappen; Zie het overzicht van eigenschappen van afhankelijkhedenvoor meer informatie.
Tijdlijnen en klokken
Het Animatieoverzicht beschreven hoe een Timeline een tijdsegment vertegenwoordigt en een animatie een type Timeline is dat uitvoerwaarden produceert. Op zichzelf doet een Timelineniets anders dan alleen een tijdsegment beschrijven. Het is het Clock object van de tijdlijn dat het echte werk doet. Op dezelfde manier worden eigenschappen niet daadwerkelijk geanimeerd: een animatieklasse beschrijft hoe uitvoerwaarden moeten worden berekend, maar het is de Clock die is gemaakt voor de animatie die de animatie-uitvoer aanstuurt en toepast op eigenschappen.
Een Clock is een speciaal type object dat de timing-gerelateerde runtimestatus voor de Timelinebehoudt. Het biedt drie bits aan informatie die essentieel zijn voor het animatie- en timingsysteem: CurrentTime, CurrentProgressen CurrentState. Een Clock bepaalt de huidige tijd, voortgang en status door gebruik te maken van de timinggedragingen die worden beschreven door Timeline: Duration, RepeatBehavior, AutoReverse, enzovoort.
In de meeste gevallen wordt automatisch een Clock voor uw tijdlijn gemaakt. Wanneer u animaties maakt met behulp van een Storyboard of de methode BeginAnimation, worden klokken automatisch gemaakt voor uw tijdlijnen en animaties en toegepast op hun doeleigenschappen. U kunt ook expliciet een Clock maken met behulp van de CreateClock methode van uw Timeline. De methode MediaTimeline.CreateClock maakt een klok van het juiste type voor de Timeline waarop deze wordt aangeroepen. Als de Timeline onderliggende tijdlijnen bevat, worden er ook Clock objecten voor gemaakt. De resulterende Clock objecten worden gerangschikt in bomen die overeenkomen met de structuur van de Timeline objectstructuur waaruit ze worden gemaakt.
Er zijn verschillende soorten klokken voor verschillende soorten tijdlijnen. In de volgende tabel ziet u de Clock typen die overeenkomen met een aantal van de verschillende Timeline typen.
Tijdlijntype | Kloktype | Klokdoel |
---|---|---|
Animatie (neemt over van AnimationTimeline) | AnimationClock | Hiermee worden uitvoerwaarden voor een afhankelijkheidseigenschap gegenereerd. |
MediaTimeline | MediaClock | Hiermee wordt een mediabestand verwerkt. |
ParallelTimeline | ClockGroup | Groepeert en bestuurt zijn onderliggende Clock-objecten |
Storyboard | ClockGroup | Groepeert en beheert zijn onderliggende Clock-objecten. |
U kunt alle AnimationClock objecten die u maakt, toepassen op compatibele afhankelijkheidseigenschappen met behulp van de methode ApplyAnimationClock.
In prestatieintensieve scenario's, zoals het animeren van grote aantallen vergelijkbare objecten, kan het beheer van uw eigen Clock gebruik prestatievoordelen bieden.
Klokken en tijdbeheerder
Wanneer u objecten in WPF animeren, is dit de tijdbeheerder die de Clock objecten beheert die zijn gemaakt voor uw tijdlijnen. De tijdsbeheerder is de wortel van een boom van Clock-objecten en regelt de tijdsstroom in die boom. Er wordt automatisch een time manager gemaakt voor elke WPF-toepassing en is onzichtbaar voor de ontwikkelaar van de toepassing. De tijdmanager "tikt" vaak per seconde; het werkelijke aantal tikken dat elke seconde plaatsvindt, is afhankelijk van de beschikbare systeembronnen. Tijdens elk van deze tikken berekent de tijdmanager de status van alle ActiveClock objecten in de tijdsstructuur.
In de volgende afbeelding ziet u de relatie tussen de tijdbeheerder, AnimationClocken een geanimeerde afhankelijkheidseigenschap.
Animatie toevoegen aan een eigenschap
Wanneer de tijdbeheerder tikt, wordt de tijd van elke ActiveClock in de toepassing bijgewerkt. Als de Clock een AnimationClockis, wordt de GetCurrentValue methode van de AnimationTimeline gebruikt waaruit deze is gemaakt om de huidige uitvoerwaarde te berekenen. De AnimationClock levert de AnimationTimeline met de huidige lokale tijd, een invoerwaarde, die doorgaans de basiswaarde van de eigenschap is en een standaardbestemmingswaarde. Wanneer u de waarde van een geanimeerde eigenschap ophaalt met behulp van de GetValue methode of de CLR-accessor, krijgt u de uitvoer van de bijbehorende AnimationClock.
Klokgroepen
In de voorgaande sectie wordt beschreven hoe er verschillende typen Clock objecten zijn voor verschillende typen tijdlijnen. In de volgende afbeelding ziet u de relatie tussen de tijdmanager, een ClockGroup, een AnimationClocken een geanimeerde afhankelijkheidseigenschap. Er wordt een ClockGroup gemaakt voor tijdlijnen die andere tijdlijnen groeperen, zoals de Storyboard-klasse, waarin animaties en andere tijdlijnen worden gegroepeerd.
Een klokgroep
Compositie
Het is mogelijk om meerdere klokken te koppelen aan één eigenschap. In dat geval gebruikt elke klok de uitvoerwaarde van de voorgaande klok als basiswaarde. In de volgende afbeelding ziet u drie AnimationClock objecten die op dezelfde eigenschap zijn toegepast. Clock1 gebruikt de basiswaarde van de eigenschap animatie als invoer en gebruikt deze om uitvoer te genereren. Clock2 neemt de uitvoer van Clock1 als invoer en gebruikt deze om uitvoer te genereren. Clock3 neemt de uitvoer van Clock2 als invoer en gebruikt deze om uitvoer te genereren. Wanneer meerdere klokken tegelijkertijd van invloed zijn op dezelfde eigenschap, wordt gezegd dat ze zich in een samenstellingsketen bevinden.
Een samenstellingsketen
Houd er rekening mee dat hoewel er een relatie wordt gemaakt tussen de invoer en uitvoer van de AnimationClock objecten in de samenstellingsketen, hun timinggedrag niet wordt beïnvloed; Clock objecten (inclusief AnimationClock objecten) hebben een hiërarchische afhankelijkheid van de bovenliggende Clock objecten.
Om meerdere klokken op dezelfde eigenschap toe te passen, gebruikt u de ComposeHandoffBehavior wanneer u een Storyboard, animatie of AnimationClocktoepast.
Maatstreepjes en gebeurtenisconsolidatie
Naast het berekenen van uitvoerwaarden, voert de tijdbeheerder bij elke tik andere taken uit: het bepaalt de status van elke klok en veroorzaakt gebeurtenissen indien van toepassing.
Hoewel tikken vaak voorkomen, is het mogelijk dat er veel dingen gebeuren tussen tikken. Een Clock bijvoorbeeld kan worden gestopt, gestart en opnieuw gestopt, in welk geval de CurrentState waarde drie keer is gewijzigd. In theorie kan de CurrentStateInvalidated-gebeurtenis meerdere keren worden opgeroepen in één tick; de timing-engine consolideert echter gebeurtenissen, zodat de CurrentStateInvalidated-gebeurtenis maximaal één keer per tick kan worden opgeroepen. Dit geldt voor alle timing-gebeurtenissen: maximaal één gebeurtenis van elk type wordt gegenereerd voor een bepaald Clock object.
Wanneer een Clock de status wijzigt en teruggaat naar de oorspronkelijke toestand tussen tikken (zoals het wijzigen van Active in Stopped en terug naar Active), vindt de bijbehorende gebeurtenis nog steeds plaats.
Voor meer informatie over tijdsevenementen, zie het Overzicht van tijdsevenementen.
Huidige waarden en basiswaarden van eigenschappen
Een animatable eigenschap kan twee waarden hebben: een basiswaarde en een huidige waarde. Wanneer u de eigenschap instelt met behulp van de CLR-accessor of de methode SetValue, stelt u de basiswaarde ervan in. Wanneer een eigenschap niet is geanimeerd, zijn de basis- en huidige waarden hetzelfde.
Wanneer u een eigenschap animeert, stelt de AnimationClock de huidige waarde van de eigenschap bij. Als u de waarde van de eigenschap opzoekt via de CLR-accessor of de GetValue methode, wordt de uitvoer van de AnimationClock geretourneerd wanneer de AnimationClock is Active of Filling. U kunt de basiswaarde van de eigenschap ophalen met behulp van de methode GetAnimationBaseValue.
Zie ook
- Overzicht Animatie
- Overzicht van tijdevenementen
- Overzicht van timing gedrag
.NET Desktop feedback