Przegląd Zdarzenia chronometrażu

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

Wymagania 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 ich używać w znaczników i kodzie, przykłady w tym przeglądzie używają Storyboard obiektów. Jednak opisane pojęcia 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 osi czasu Clock , który wykonuje rzeczywistą pracę: zachowuje stan czasu związanego z czasem wykonywania 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ż utworzyć Clock jawnie przy użyciu CreateClock metody . Aby uzyskać więcej informacji na temat Clock obiektów, zobacz Omówienie systemu animacji i chronometrażu.

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 wiedzieć 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 animowaną prostokąt. Po zatrzymaniu osi czasu zmienisz 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ą. Mówienie osi czasu lub zegara, aby zatrzymać, tworzy "żądanie zatrzymania" rodzaju, które nie są przetwarzane, dopóki następny czas silnika nie zostanie przetworzony.

Aby wykonać polecenia po zakończeniu osi czasu, użyj zdarzeń chronometrażu. 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ń chronometrażu. W poniższej tabeli wymieniono te zdarzenia i warunki, które je wyzwalają.

Zdarzenie Wyzwalanie operacji interakcyjnej Inne wyzwalacze
Ukończone Pomiń do wypełnienia Zegar kończy się.
Currentglobalspeedinvalidated Wstrzymywanie, wznawianie, wyszukiwanie, ustawianie współczynnika szybkości, pomijanie, zatrzymywanie Zegar odwraca się, przyspiesza, uruchamia lub zatrzymuje.
Currentstateinvalidated Rozpocznij, przejdź do wypełnienia, zatrzymaj Zegar rozpoczyna się, zatrzymuje lub wypełnia.
CurrentTimeInvalidated Rozpocznij, poszukaj, przejdź do wypełnienia, zatrzymaj Zegar postępuje.
RemoveRequested Usuń

Tykanie i konsolidacja zdarzeń

Podczas animowania obiektów w WPF jest to aparat chronometrażu, który zarządza animacjami. Aparat chronometrażu śledzi postęp czasu i oblicza stan każdej animacji. To sprawia, że wiele takich ocen przechodzi w ciągu sekundy. Te wyniki oceny są nazywane "kleszczami".

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 jego bieżący stan zmieni się trzy razy. Teoretycznie zdarzenie może być podniesione wiele razy w jednym kleszczu; aparat chronometrażu konsoliduje jednak zdarzenia, dzięki czemu każde zdarzenie można podnieść co najwyżej raz na znacznik.

Rejestrowanie pod kątem zdarzeń

Istnieją dwa sposoby rejestrowania na potrzeby zdarzeń chronometrażu: możesz zarejestrować się za pomocą osi czasu lub zegara utworzonego na podstawie osi czasu. Rejestrowanie zdarzenia bezpośrednio za pomocą zegara jest dość proste, chociaż można to zrobić tylko z poziomu kodu. Możesz zarejestrować się pod kątem zdarzeń przy użyciu osi czasu z znaczników lub kodu. W następnej sekcji opisano sposób rejestrowania zdarzeń zegara za pomocą osi czasu.

Rejestrowanie w przypadku zdarzeń zegara za pomocą osi czasu

Chociaż osi czasu Completed, , CurrentGlobalSpeedInvalidatedCurrentStateInvalidatedi CurrentTimeInvalidatedRemoveRequested zdarzenia wydają się być skojarzone z osią czasu, rejestrowanie w przypadku tych zdarzeń rzeczywiście kojarzy procedurę obsługi zdarzeń utworzoną Clock dla osi czasu.

Podczas rejestrowania Completed się na potrzeby zdarzenia na osi czasu, na przykład mówisz systemowi, aby zarejestrował się w Completed przypadku zdarzenia każdego zegara utworzonego dla osi czasu. W kodzie musisz zarejestrować się w tym zdarzeniu 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ż