Přehled událostí časování
Toto téma popisuje, jak používat pět událostí časování dostupných u Timeline objektů a Clock objektů.
Předpoklady
Abyste pochopili toto téma, měli byste vědět, jak vytvářet a používat animace. Pokud chcete začít s animací, podívejte se na přehled animací.
Vlastnosti ve WPF můžete animovat několika způsoby:
Použití objektů scénáře (značek a kódu): Objekty můžete použít Storyboard k uspořádání a distribuci animací do jednoho nebo více objektů. Příklad najdete v tématu Animace vlastnosti pomocí scénáře.
Použití místních animací (pouze kód): Objekty můžete použít AnimationTimeline přímo na vlastnosti, které animují. Příklad najdete v tématu Animace vlastnosti bez použití scénáře.
Pomocí hodin (pouze kód): Vytváření hodin můžete explicitně spravovat a distribuovat animační hodiny sami. Příklad naleznete v tématu Animace vlastnosti pomocí AnimationClock.
Protože je můžete použít ve značkách a kódu, příklady v tomto přehledu používají Storyboard objekty. Popisované koncepty se ale dají použít na jiné metody animace vlastností.
Co je hodina?
Časová osa sama o sobě ve skutečnosti nedělá nic jiného, než popisuje segment času. Jedná se o objekt časové osy Clock , který dělá skutečnou práci: udržuje stav běhu související s časováním časové osy. Ve většině případů, například při použití scénářů, se pro časovou osu vytvoří automaticky hodiny. Pomocí této metody můžete také explicitně CreateClock vytvořitClock. Další informace o Clock objektech naleznete v přehledu systému animace a časování.
Proč používat události?
S výjimkou jedné (hledání v souladu s posledním zaškrtnutím) jsou všechny interaktivní operace časování asynchronní. Neexistuje způsob, jak přesně vědět, kdy se spustí. To může být problém, pokud máte jiný kód, který závisí na operaci časování. Předpokládejme, že chcete zastavit časovou osu, která animuje obdélník. Po zastavení časové osy změníte barvu obdélníku.
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
V předchozím příkladu se druhý řádek kódu může spustit před zastavením scénáře. Důvodem je zastavení asynchronní operace. Když řeknete časové ose nebo hodiny, aby se zastavily, vytvoří se "žádost o zastavení" řazení, která se nezpracuje, dokud další zaškrtnutí časového modulu nezpracuje.
Pokud chcete po dokončení časové osy spouštět příkazy, použijte události časování. V následujícím příkladu se obslužná rutina události používá ke změně barvy obdélníku po zastavení přehrávání scénáře.
// 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
Podrobnější příklad najdete v tématu Příjem oznámení Při změně stavu hodin.
Veřejné události
Clock Obě třídy Timeline poskytují pět událostí časování. Následující tabulka uvádí tyto události a podmínky, které je aktivují.
Událost | Aktivace interaktivní operace | Další triggery |
---|---|---|
Dokončeno | Přeskočit k vyplnění | Hodiny se dokončí. |
Currentglobalspeedinvalidated | Pozastavení, obnovení, hledání, nastavení poměru rychlosti, přeskočení na výplň, zastavení | Hodiny se otočí, urychlí, spustí nebo zastaví. |
Currentstateinvalidated | Začátek, přeskočte na výplň, zastavte | Hodiny začínají, zastavují nebo vyplňují. |
CurrentTimeInvalidated | Begin, seek, skip to fill, stop | Hodiny probíhají. |
RemoveRequested | Odebrat |
Zaškrtnutí a konsolidace událostí
Když animujete objekty ve WPF, je to časovací modul, který spravuje vaše animace. Časovací modul sleduje průběh času a vypočítá stav jednotlivých animací. Mnoho takových vyhodnocení projde za sekundu. Tyto zkušební průchody se označují jako "ticks".
Zatímco klíště dochází často, je možné, že se mezi ticky stane spousta věcí. Například časová osa může být zastavena, spuštěna a zastavena znovu, v takovém případě se její aktuální stav třikrát změní. Teoreticky by událost mohla být vyvolána vícekrát v jediném klíště; časovací modul však konsoliduje události, takže každá událost může být vyvolána maximálně jednou pro každé zaškrtnutí.
Registrace událostí
Události časování se dají zaregistrovat dvěma způsoby: můžete se zaregistrovat na časové ose nebo pomocí hodin vytvořených z časové osy. Registrace události přímo pomocí hodin je poměrně jednoduchá, i když ji lze provést pouze z kódu. Události můžete zaregistrovat na časové ose z revizí nebo kódu. Další část popisuje, jak zaregistrovat události hodin s časovou osou.
Registrace událostí hodin na časové ose
I když se zdá, že časová osa Completed, CurrentGlobalSpeedInvalidated, CurrentTimeInvalidatedCurrentStateInvalidateda RemoveRequested události jsou přidružené k časové ose, registrace těchto událostí ve skutečnosti přidruží obslužnou rutinu události k Clock vytvořené časové ose.
Když se zaregistrujete k Completed události na časové ose, například říkáte systému, aby se zaregistroval k Completed události jednotlivých hodin vytvořených pro časovou osu. V kódu se před vytvořením této časové osy musíte zaregistrovat k této události Clock . V opačném případě nebudete dostávat oznámení. K tomu dochází automaticky v XAML; analyzátor automaticky zaregistruje událost před vytvořením Clock .
Viz také
.NET Desktop feedback