Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det här avsnittet beskriver hur du använder de fem tidshändelser som är tillgängliga för Timeline och Clock objekt.
Förutsättningar
För att förstå det här avsnittet bör du förstå hur du skapar och använder animeringar. Information om hur du kommer igång med animering finns i Översikt över animering.
Det finns flera sätt att animera egenskaper i WPF:
Använda storyboard-objekt (markering och kod): Du kan använda Storyboard objekt för att ordna och distribuera animeringar till ett eller flera objekt. Ett exempel finns i Animera en egenskap med hjälp av en storyboard.
Använda lokala animeringar (endast kod): Du kan tillämpa AnimationTimeline objekt direkt på de egenskaper som de animerar. Ett exempel finns i Animera en egenskap utan att använda Storyboard.
Använda klockor (endast kod): Du kan uttryckligen hantera skapandet av klockan och distribuera animeringsklockorna själv. Ett exempel finns i Animera en egenskap med hjälp av en animationsklocka.
Eftersom du kan använda dem i markering och kod använder exemplen i denna översikt Storyboard-objekt. De begrepp som beskrivs kan dock tillämpas på de andra metoderna för att animera egenskaper.
Vad är en klocka?
En tidslinje gör i sig inget annat än att beskriva ett tidssegment. Det är tidslinjens Clock objekt som utför det verkliga arbetet: det upprätthåller tidsrelaterat körningstillstånd för tidslinjen. I de flesta fall, till exempel när du använder storyboards, skapas en klocka automatiskt för din tidslinje. Du kan också skapa en Clock explicit genom att använda CreateClock-metoden. Mer information om Clock objekt finns i Översikt över animerings- och tidsschemasystem.
Varför ska jag använda händelser?
Med undantag för en (sök efter den senaste ticken) är alla interaktiva tidsinställningar asynkrona. Du kan omöjligt veta exakt när de kommer att genomföras. Det kan vara ett problem när du har annan kod som är beroende av din tidsåtgärd. Anta att du ville stoppa en tidslinje som animerade en rektangel. När tidslinjen har stannat ändrar du färgen på rektangeln.
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
I föregående exempel kan den andra kodraden köras innan storyboarden stoppas. Det beror på att stopp är en asynkron åtgärd. Om du säger åt en tidslinje eller klocka att sluta, skapas en form av "stoppbegäran" som inte bearbetas förrän vid nästa tick av tidsmotorn.
Om du vill köra kommandon när en tidslinje har slutförts använder du tidshändelser. I följande exempel används en händelsehanterare för att ändra färgen på en rektangel när storyboarden slutar spelas upp.
// 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
Ett mer komplett exempel finns i Ta emot meddelande när en klockas tillstånd ändras.
Offentliga evenemang
Klasserna Timeline och Clock innehåller båda fem tidshändelser. I följande tabell visas dessa händelser och de villkor som utlöser dem.
| Evenemang | Utlöser interaktiv åtgärd | Andra utlösare |
|---|---|---|
| slutförd | Hoppa över att fylla i | Klockan är färdig. |
| NuvarandeGlobalHastighetOgiltigförklarad | Pausa, återuppta, söka, ange hastighetsförhållande, hoppa över till fyllning, stoppa | Klockan vänder, accelererar, startar eller stoppar. |
| NuvarandeTillståndOgiltigförklarat | Börja, hoppa över för att fylla, stoppa | Klockan startar, stannar eller fyller på. |
| AktuellTidOgiltigförklarad | Börja, sök efter, hoppa över för att fylla i, stanna | Klockan går framåt. |
| Begäran om borttagning | Ta bort |
Tidshantering och konsolidering av händelser
När du animerar objekt i WPF är det tidsmotorn som hanterar dina animeringar. Tidsmotorn spårar tidens förlopp och beräknar tillståndet för varje animering. Det genomför många sådana utvärderingar per sekund. Dessa utvärderingspass kallas "ticks".
Även om fästingar förekommer ofta är det möjligt för många saker att hända mellan fästingar. En tidslinje kan till exempel stoppas, startas och stoppas igen, i vilket fall dess aktuella tillstånd har ändrats tre gånger. I teorin kan händelsen triggas flera gånger under en enda takt; timingmotorn konsoliderar dock händelser så att varje händelse kan triggas högst en gång per takt.
Registrera dig för händelser
Det finns två sätt att registrera dig för tidshändelser: du kan registrera dig med tidslinjen eller med klockan som skapats från tidslinjen. Det är ganska enkelt att registrera sig för en händelse direkt med en klocka, även om det bara kan göras från kod. Du kan registrera dig för evenemang via en tidslinje från markup eller kod. I nästa avsnitt beskrivs hur du registrerar dig för klockhändelser med en tidslinje.
Registrering av klockhändelser med en tidslinje
Även om en tidslinjes Completed, , CurrentGlobalSpeedInvalidatedCurrentStateInvalidated, CurrentTimeInvalidatedoch RemoveRequested händelser verkar vara associerade med tidslinjen, associerar registreringen för dessa händelser faktiskt en händelsehanterare med den Clock som skapats för tidslinjen.
När du registrerar dig för Completed-händelsen i tidslinjen, instruerar du faktiskt systemet att registrera sig för Completed-händelsen för varje klocka som skapas till tidslinjen. I kod måste du registrera dig för den här händelsen innan den Clock skapas för den här tidslinjen. Annars får du inget meddelande. Detta sker automatiskt i XAML; parsern registreras automatiskt för händelsen innan den Clock skapas.
Se även
.NET Desktop feedback