Overzicht van tijdgebeurtenissen
In dit onderwerp wordt beschreven hoe u de vijf timing-gebeurtenissen gebruikt die beschikbaar zijn voor Timeline- en Clock-objecten.
Voorwaarden
Als u dit onderwerp wilt begrijpen, moet u begrijpen hoe u animaties maakt en gebruikt. Zie het Animatieoverzichtom aan de slag te gaan met animatie.
Er zijn meerdere manieren om eigenschappen in WPF te animeren:
Het gebruik van storyboard-objecten (markeringen en code): U kunt Storyboard objecten gebruiken om animaties te rangschikken en distribueren naar een of meer objecten. Zie voor een voorbeeld Animeren van een Eigenschap met behulp van een Storyboard.
Lokale animaties gebruiken (alleen code): U kunt AnimationTimeline objecten rechtstreeks toepassen op de eigenschappen die ze animeren. Zie bijvoorbeeld Een eigenschap animeren zonder een Storyboard-te gebruiken.
Klokken gebruiken (alleen code): U kunt het maken van de klok expliciet beheren en de animatieklokken zelf distribueren. Zie het voorbeeld in Een eigenschap animeren met behulp van een AnimationClock.
Omdat u deze kunt gebruiken in markeringen en code, gebruiken de voorbeelden in dit overzicht Storyboard objecten. De beschreven concepten kunnen echter worden toegepast op de andere methoden voor het animeren van eigenschappen.
Wat is een klok?
Een tijdlijn doet op zichzelf niets anders dan een tijdsegment beschrijven. Het is het Clock-object van de tijdlijn dat het echte werk doet: het onderhoudt de aan timing gerelateerde run-time-status voor de tijdlijn. In de meeste gevallen, zoals bij het gebruik van storyboards, wordt automatisch een klok gemaakt voor uw tijdlijn. U kunt ook expliciet een Clock maken met behulp van de methode CreateClock. Zie voor meer informatie over Clock objecten het Animatie- en tijdsinstellingensysteemoverzicht.
Waarom gebeurtenissen gebruiken?
Met uitzondering van één (zoek uitgelijnd op laatste tik), zijn alle interactieve tijdsbewerkingen asynchroon. U kunt niet precies weten wanneer ze worden uitgevoerd. Dit kan een probleem zijn wanneer u andere code hebt die afhankelijk is van uw tijdsbewerking. Stel dat u een tijdlijn wilt stoppen waarmee een rechthoek is geanimeerd. Nadat de tijdlijn is gestopt, wijzigt u de kleur van de rechthoek.
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
In het vorige voorbeeld kan de tweede regel code worden uitgevoerd voordat het storyboard stopt. Dat komt doordat stoppen een asynchrone bewerking is. Als je een tijdlijn of klok vertelt om te stoppen, wordt er een soort van 'stopaanvraag' gemaakt die pas bij de volgende tik van de timing-engine wordt verwerkt.
Als u opdrachten wilt uitvoeren nadat een tijdlijn is voltooid, gebruikt u tijdsinstellingen. In het volgende voorbeeld wordt een gebeurtenis-handler gebruikt om de kleur van een rechthoek te wijzigen nadat het storyboard stopt met afspelen.
// 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
Zie Melding ontvangen wanneer de status van een klok verandertvoor een volledig voorbeeld.
Openbare gebeurtenissen
De klassen Timeline en Clock bieden beide vijf timing-gebeurtenissen. De volgende tabel bevat deze gebeurtenissen en de voorwaarden waarmee ze worden geactiveerd.
Gebeurtenis | Interactieve bewerking activeren | Andere triggers |
---|---|---|
voltooide | Overslaan om op te vullen | De klok is klaar. |
CurrentGlobalSpeedInvalidated | Onderbreken, hervatten, zoeken, snelheidsverhouding instellen, overslaan naar opvulling, stoppen | De klok draait terug, versnelt, start of stopt. |
CurrentStateInvalidated | Begin, sla over om te vullen, stop | De klok begint, stopt of vult. |
CurrentTimeInvalidated- | Begin, zoeken, overslaan om te vullen, stop | De tijd gaat verder. |
VerwijderVerzocht | Verwijderen |
Tikproces en gebeurtenisconsolidatie
Wanneer u objecten in WPF animeren, is dit de timing-engine die uw animaties beheert. De timing-engine houdt de voortgang van de tijd bij en berekent de status van elke animatie. Het maakt veel van dergelijke evaluatiepassen in een seconde. Deze evaluatiesessies worden 'tikken' genoemd.
Hoewel tikken vaak voorkomen, is het mogelijk dat er veel dingen gebeuren tussen tikken. Een tijdlijn kan bijvoorbeeld worden gestopt, gestart en opnieuw gestopt. In dat geval is de huidige status drie keer gewijzigd. In theorie kan het evenement meerdere keren binnen één tick worden opgeroepen; de timing-engine consolideert echter evenementen, zodat elk evenement maximaal één keer per tick kan worden gegenereerd.
Registreren voor gebeurtenissen
Er zijn twee manieren om u te registreren voor tijdevenementen: u kunt zich registreren bij de tijdlijn of met de klok die vanuit de tijdlijn is gemaakt. Het rechtstreeks registreren van een gebeurtenis met een klok is vrij eenvoudig, hoewel het alleen vanuit code kan worden gedaan. U kunt zich registreren voor gebeurtenissen met een tijdlijn vanuit markeringen of code. In de volgende sectie wordt beschreven hoe u zich registreert voor klokevenementen met een tijdlijn.
Registreren voor klokevenementen met een tijdlijn
Hoewel gebeurtenissen zoals Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidateden RemoveRequested aan een tijdlijn lijken te zijn gekoppeld, komt het bij het registreren voor deze gebeurtenissen daadwerkelijk neer op het koppelen van een event handler aan de Clock die voor de tijdlijn is gemaakt.
Wanneer u zich bijvoorbeeld registreert voor de Completed-gebeurtenis op een tijdlijn, geeft u het systeem daadwerkelijk de opdracht om zich te registreren voor de Completed-gebeurtenis van elke klok die voor de tijdlijn wordt gemaakt. In code moet u zich registreren voor deze gebeurtenis voordat de Clock voor deze tijdlijn wordt gemaakt; anders ontvangt u geen melding. Dit gebeurt automatisch in XAML; de parser registreert automatisch voor de gebeurtenis voordat de Clock wordt gemaakt.
Zie ook
- Overzicht van Animatie- en tijdsinstellingensysteem
- Animationsoverzicht
- Overzicht van timinggedrag
.NET Desktop feedback