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 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 osi czasu Clock , który wykonuje rzeczywistą pracę: utrzymuje stan czasu związany 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 animacji i systemu 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 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ą. Mówienie osi czasu lub zegara, aby zatrzymać tworzy "żądanie zatrzymania" rodzajów, które nie są przetwarzane do następnego znacznika czasu aparatu.

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.

Wydarzenia publiczne

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

Wydarzenie Wyzwalanie operacji interakcyjnej Inne wyzwalacze
Zakończono Przejdź do wypełnienia Zegar kończy się.
Currentglobalspeedinvalidated Wstrzymywanie, wznawianie, wyszukiwanie, ustawianie współczynnika szybkości, przechodzenie do wypełnienia, zatrzymywanie Zegar odwraca się, przyspiesza, uruchamia lub zatrzymuje.
Currentstateinvalidated Rozpocznij, przejdź do wypełnienia, zatrzymaj Zegar zaczyna się, zatrzymuje lub wypełnia.
CurrentTimeInvalidated Rozpocznij, szukaj, przejdź do wypełnienia, zatrzymaj Zegar postępuje.
RemoveRequested Usuwanie

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 przebiegi ewaluacyjne 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 jej bieżący stan zostanie zmieniony 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że być wywoływane co najwyżej raz na znacznik.

Rejestrowanie pod kątem zdarzeń

Istnieją dwa sposoby rejestrowania się na potrzeby zdarzeń chronometrażu: można 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. Zdarzenia można zarejestrować przy użyciu osi czasu z znaczników lub kodu. W następnej sekcji opisano sposób rejestrowania się na potrzeby zdarzeń zegara z osią czasu.

Rejestrowanie na potrzeby zdarzeń zegara z osią czasu

Mimo że osi czasuCompleted, , CurrentGlobalSpeedInvalidatedCurrentStateInvalidated, CurrentTimeInvalidatedi RemoveRequested zdarzenia wydają się być skojarzone z osią czasu, rejestracja dla tych zdarzeń rzeczywiście kojarzy program obsługi zdarzeń z Clock utworzonym dla osi czasu.

Na przykład podczas rejestrowania się w przypadku zdarzenia na osi czasu w rzeczywistości informujesz system o zarejestrowaniu Completed się w Completed celu uzyskania 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 się dla zdarzenia przed utworzeniem Clock .

Zobacz też