Udostępnij za pośrednictwem


Przegląd zdarzeń czasowych

W tym temacie opisano sposób używania pięciu zdarzeń czasowych dostępnych w obiektach Timeline i Clock.

Warunki wstępne

Aby zrozumieć ten temat, należy zrozumieć, jak tworzyć animacje i używać ich. Aby rozpocząć pracę z animacją, zobacz Omówienie animacji.

Istnieje wiele sposobów animowania właściwości w WPF:

Ponieważ można je używać w znacznikach i kodzie, przykłady w niniejszym przeglądzie używają obiektów Storyboard. Jednak opisane koncepcje można zastosować do innych metod animowania właściwości.

Co to jest zegar?

Oś czasu sama w sobie nie robi nic innego niż opisywanie segmentu czasu. Jest to obiekt Clock osi czasu, który wykonuje rzeczywistą pracę: utrzymuje stan wykonawczy związany z czasem dla osi czasu. W większości przypadków, takich jak w przypadku korzystania z scenorysów, zegar jest tworzony automatycznie dla osi czasu. Można również jawnie utworzyć Clock przy użyciu metody CreateClock. Aby uzyskać więcej informacji na temat obiektów Clock, zobacz Omówienie systemu animacji i synchronizacji.

Dlaczego warto używać zdarzeń?

Z wyjątkiem jednego (wyszukiwanie wyrównane do ostatniego znacznika) wszystkie interaktywne operacje chronometrażu są asynchroniczne. Nie ma możliwości, abyś wiedział dokładnie, kiedy zostaną wykonane. Może to być problem, gdy masz inny kod zależny od operacji chronometrażu. Załóżmy, że chcesz zatrzymać oś czasu, która animowała prostokąt. Po zatrzymaniu osi czasu zmieniasz kolor prostokąta.

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

W poprzednim przykładzie drugi wiersz kodu może zostać wykonany przed zatrzymanie scenorysu. Dzieje się tak, ponieważ zatrzymywanie jest operacją asynchroniczną. Polecenie zatrzymania osi czasu lub zegara tworzy rodzaj "żądania zatrzymania", które nie jest przetwarzane do następnego tyknięcia aparatu zegarowego.

Aby wykonać polecenia po zakończeniu osi czasu, użyj zdarzeń czasowych. W poniższym przykładzie program obsługi zdarzeń służy do zmiany koloru prostokąta po zatrzymaniu odtwarzania scenorysu.

// 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

Aby uzyskać bardziej kompletny przykład, zobacz Odbieranie powiadomień po zmianie stanu zegara.

Zdarzenia publiczne

Klasy Timeline i Clock zapewniają pięć zdarzeń czasowych. W poniższej tabeli wymieniono te zdarzenia i warunki, które je wyzwalają.

Zdarzenie Wyzwalanie operacji interakcyjnej Inne wyzwalacze
Zakończono Przejdź do wypełnienia Zegar kończy się.
BieżącaGlobalnaPrędkośćUnieważniona Wstrzymywanie, wznawianie, wyszukiwanie, ustawianie współczynnika szybkości, przechodzenie do wypełnienia, zatrzymywanie Zegar odwraca się, przyspiesza, uruchamia lub zatrzymuje.
StanBieżącyNieważny Rozpocznij, przejdź do uzupełnienia, zatrzymaj Zegar zaczyna działać, zatrzymuje się lub wypełnia się.
CurrentTimeInvalidated (czas nieaktualny) Rozpocznij, szukaj, przejdź do wypełnienia, zatrzymaj Zegar posuwa się naprzód.
UsunięcieZlecone Usunąć

Tykanie i konsolidacja zdarzeń

W WPF, podczas animowania obiektów, to silnik zarządzający czasem zarządza animacjami. Aparat chronometrażu śledzi postęp czasu i oblicza stan każdej animacji. Dokonuje wielu takich ocen w ciągu sekundy. Te przebiegi ewaluacyjne są nazywane "cyklami".

Podczas gdy kleszcze występują często, istnieje możliwość, że wiele rzeczy dzieje się między kleszczami. Na przykład oś czasu może zostać zatrzymana, uruchomiona i zatrzymana ponownie, w tym przypadku jej bieżący stan zostanie zmieniony trzy razy. Teoretycznie zdarzenie może być wywoływane wiele razy w pojedynczym cyklu; jednak mechanizm czasowy konsoliduje zdarzenia, dzięki czemu to samo zdarzenie może być wywoływane co najwyżej raz na cykl.

Rejestracja na wydarzenia

Istnieją dwa sposoby rejestrowania się na zdarzenia związane z czasem: można zarejestrować się za pomocą osi czasu lub zegara stworzonego na jej podstawie. Rejestrowanie zdarzenia bezpośrednio za pomocą zegara jest dość proste, chociaż można to zrobić tylko z poziomu kodu. Zdarzenia można zarejestrować przy użyciu osi czasu z znaczników lub kodu. W następnej sekcji opisano, jak zarejestrować się na wydarzenia zegara z osią czasu.

Rejestrowanie na potrzeby zdarzeń zegara z osią czasu

Mimo że zdarzenia osi czasu Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidatedi RemoveRequested wydają się być skojarzone z osią czasu, zarejestrowanie tych zdarzeń rzeczywiście kojarzy program obsługi zdarzeń z Clock, który został utworzony dla osi czasu.

Na przykład, gdy rejestrujesz się na zdarzenie Completed na osi czasu, w rzeczywistości informujesz system, aby zarejestrować się na zdarzenie Completed każdego zegara utworzonego dla osi czasu. W kodzie musisz zarejestrować się na to zdarzenie przed utworzeniem Clock dla tej osi czasu; w przeciwnym razie nie otrzymasz powiadomienia. Dzieje się to automatycznie w języku XAML; analizator automatycznie rejestruje zdarzenie przed utworzeniem Clock.

Zobacz też