Общие сведения о временных событиях

В этом разделе описано, как использовать пять доступных временных событий для объектов Timeline и Clock.

Необходимые компоненты

Для понимания этого раздела вы должны знать, как создавать и использовать анимации. Чтобы приступить к работе с анимацией, обратитесь к разделу Общие сведения об эффектах анимации.

Существует несколько способов анимирования свойств в WPF:

В примерах в этом обзоре используются объекты Storyboard, так как их можно использовать в разметке и в коде. Тем не менее описанные здесь идеи также применяются к другим методам анимирования свойств.

Что такое часы?

Временная шкала сама по себе просто описывает сегмент времени. Все действия выполняет объект Clock временной шкалы: он контролирует выполнение временной шкалы с привязкой ко времени. В большинстве случаев, например при использовании раскадровок, часы для временной шкалы создаются автоматически. Объект Clock можно создать явным образом с помощью метода CreateClock. Дополнительные сведения об объектах Clock см. в разделе Общие сведения об анимации и системе управления временем.

Зачем использовать события?

Все интерактивные временные операции являются асинхронными. Исключение составляет лишь поиск, который выравнивается по последнему такту. Точно определить, когда будут выполнены операции, невозможно. При наличии другого кода, который зависит от вашей операции, это может вызвать проблемы. Предположим, что вы хотите остановить временную шкалу, которая анимировала прямоугольник. После остановки временной шкалы вы изменяете цвет прямоугольника.

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

В предыдущем примере вторая строка кода может быть выполнена до того, как раскадровка будет остановлена. Это вызвано тем, что остановка является асинхронной операцией. При отправке команды на остановку временной шкалы или часов создается своего рода "запрос на остановку". Этот запрос обрабатывается только на следующем такте системы управления временем.

Для выполнения команд после завершения временной шкалы используйте временные события. В следующем примере для изменения цвета прямоугольника после окончания воспроизведения раскадровки используется обработчик событий.

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

Более полный пример см. в разделе Получение уведомлений при изменениях состояния часов.

Публичные события

Оба класса Timeline и Clock предоставляют пять временных событий. В следующей таблице перечислены эти события и условия, которые их вызывают.

Событие Интерактивная операция, вызывающая событие Другие условия
Завершено Переход к заполнению Часы останавливаются.
CurrentGlobalSpeedInvalidated Пауза, возобновление, поиск, установка соотношения скорости, переход к заполнению Часы запускаются в обратном направлении, ускоряются, запускаются в обычном направлении или останавливаются.
CurrentStateInvalidated Начало, переход к заполнению, остановка Часы запускаются, останавливаются, или выполняется заполнение.
CurrentTimeInvalidated Начало, поиск, переход к заполнению, остановка Часы работают.
RemoveRequested Удалить

Такты и объединение событий

При анимации объектов в WPF за управление анимациями отвечает система управления временем. Система управления временем отслеживает ход времени и вычисляет состояние каждой анимации. Она выполняет эти действия несколько раз в секунду. Такие вычислительные проходы называются "тактами".

Хотя такты меняются часто, между ними может возникать множество событий. Например, временная шкала может быть остановлена, запущена и снова остановлена, в этом случае ее состояние будет изменено три раза. Теоретически событие может вызываться несколько раз в одном такте. Однако система управления временем объединяет события, чтобы каждое событие могло происходить не более одного раза за такт.

Регистрация в событиях

Существует два способа регистрации временных событий: их можно зарегистрировать на временной шкале и на часах, созданных на основе временной шкалы. Регистрация события непосредственно на часах достаточно проста, но ее можно выполнить только в коде. Зарегистрировать события на временной шкале можно как в коде, так и в разметке. В следующем разделе описано, как зарегистрировать события часов на временной шкале.

Регистрация событий часов на временной шкале

Несмотря на то, что события Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidated и RemoveRequested временной шкалы, как представляется, связаны с временной шкалой, регистрация этих событий фактически связывает обработчик событий с Clock, созданными для временной шкалы.

Когда вы регистрируете событие Completed на временной шкале, например, вы фактически даете системе команду зарегистрировать событие Completed всех часов, созданных для этой временной шкалы. В коде это событие необходимо зарегистрировать до того, как будет создан объект Clock для временной шкалы. В противном случае вы не получите уведомление. В это происходит автоматически; средство анализа автоматически регистрирует событие до того, как будет создан объект Clock.

См. также