Share via


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:

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é