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

В этом разделе описываются способы использования пяти временных событий, доступных на Timeline и Clock объектов.This topic describes how to use the five timing events available on Timeline and Clock objects.

Предварительные требованияPrerequisites

Для понимания этого раздела вы должны знать, как создавать и использовать анимации.To understand this topic, you should understand how to create and use animations. Чтобы приступить к работе с анимацией, см. в разделе Общие сведения об анимации.To get started with animation, see the Animation Overview.

Существует несколько способов анимирования свойств в WPFWPF:There are multiple ways to animate properties in WPFWPF:

Так как их можно использовать в разметке и коде, в примерах в этом обзоре используются Storyboard объектов.Because you can use them in markup and code, the examples in this overview use Storyboard objects. Тем не менее описанные здесь идеи также применяются к другим методам анимирования свойств.However, the concepts described can be applied to the other methods of animating properties.

Что такое часы?What is a clock?

Временная шкала сама по себе просто описывает сегмент времени.A timeline, by itself, doesn't actually do anything other than describe a segment of time. Он является временной шкалы Clock объект, который не работает: он обеспечивает связана со временем состояние времени выполнения для временной шкалы.It's the timeline's Clock object that does the real work: it maintains timing-related run-time state for the timeline. В большинстве случаев, например при использовании раскадровок, часы для временной шкалы создаются автоматически.In most cases, such as when using storyboards, a clock is created automatically for your timeline. Вы также можете создать Clock явным образом с помощью CreateClock метод.You can also create a Clock explicitly by using the CreateClock method. Дополнительные сведения о Clock объектов, см. в разделе анимации и общие сведения о характере системы.For more information about Clock objects, see the Animation and Timing System Overview.

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

Все интерактивные временные операции являются асинхронными. Исключение составляет лишь поиск, который выравнивается по последнему такту.With the exception of one (seek aligned to last tick), all interactive timing operations are asynchronous. Точно определить, когда будут выполнены операции, невозможно.There is no way for you to know exactly when they will execute. При наличии другого кода, который зависит от вашей операции, это может вызвать проблемы.That can be a problem when you have other code that's dependent upon your timing operation. Предположим, что вы хотите остановить временную шкалу, которая анимировала прямоугольник.Suppose that you wanted to stop a timeline that animated a rectangle. После остановки временной шкалы вы изменяете цвет прямоугольника.After the timeline stops, you change the color of the rectangle.

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

В предыдущем примере вторая строка кода может быть выполнена до того, как раскадровка будет остановлена.In the previous example, the second line of code might execute before the storyboard stops. Это вызвано тем, что остановка является асинхронной операцией.That's because stopping is an asynchronous operation. При отправке команды на остановку временной шкалы или часов создается своего рода "запрос на остановку". Этот запрос обрабатывается только на следующем такте системы управления временем.Telling a timeline or clock to stop creates a "stop request" of sorts that isn't processed until the timing engine's next tick.

Для выполнения команд после завершения временной шкалы используйте временные события.To execute commands after a timeline completes, use timing events. В следующем примере для изменения цвета прямоугольника после окончания воспроизведения раскадровки используется обработчик событий.In the following example, an event handler is used to change the color of a rectangle after the storyboard stops playing.

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

Более полный пример, см. в разделе получения уведомлений при изменениях состояния часов.For a more complete example, see Receive Notification When a Clock's State Changes.

Открытые событияPublic Events

Timeline И Clock классы предоставляют пять временных событий.The Timeline and Clock classes both provide five timing events. В следующей таблице перечислены эти события и условия, которые их вызывают.The following table lists these events and the conditions that trigger them.

событиеEvent Интерактивная операция, вызывающая событиеTriggering interactive operation Другие условияOther triggers
CompletedCompleted Переход к заполнениюSkip to fill Часы останавливаются.The clock completes.
CurrentGlobalSpeedInvalidatedCurrentGlobalSpeedInvalidated Пауза, возобновление, поиск, установка соотношения скорости, переход к заполнениюPause, resume, seek, set speed ratio, skip to fill, stop Часы запускаются в обратном направлении, ускоряются, запускаются в обычном направлении или останавливаются.The clock reverses, accelerates, starts, or stops.
CurrentStateInvalidatedCurrentStateInvalidated Начало, переход к заполнению, остановкаBegin, skip to fill, stop Часы запускаются, останавливаются, или выполняется заполнение.The clock starts, stops, or fills.
CurrentTimeInvalidatedCurrentTimeInvalidated Начало, поиск, переход к заполнению, остановкаBegin, seek, skip to fill, stop Часы работают.The clock progresses.
RemoveRequestedRemoveRequested УдалитьRemove

Такты и объединение событийTicking and Event Consolidation

При анимации объектов в WPFWPF, обработчик синхронизации управляет анимациями.When you animate objects in WPFWPF, it’s the timing engine that manages your animations. Система управления временем отслеживает ход времени и вычисляет состояние каждой анимации.The timing engine tracks the progression of time and computes the state of each animation. Она выполняет эти действия несколько раз в секунду.It makes many such evaluation passes in a second. Такие вычислительные проходы называются "тактами".These evaluation passes are known as "ticks."

Хотя такты меняются часто, между ними может возникать множество событий.While ticks occur frequently, it's possible for a lot of things to happen between ticks. Например, временная шкала может быть остановлена, запущена и снова остановлена, в этом случае ее состояние будет изменено три раза.For example, a timeline might be stopped, started, and stopped again, in which case its current state will have changed three times. Теоретически событие может вызываться несколько раз в одном такте. Однако система управления временем объединяет события, чтобы каждое событие могло происходить не более одного раза за такт.In theory, the event could be raised multiple times in a single tick; however, the timing engine consolidates events, so that each event can be raised at most once per tick.

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

Существует два способа регистрации временных событий: их можно зарегистрировать на временной шкале и на часах, созданных на основе временной шкалы.There are two ways to register for timing events: you can register with the timeline or with the clock created from the timeline. Регистрация события непосредственно на часах достаточно проста, но ее можно выполнить только в коде.Registering for an event directly with a clock is fairly straightforward, although it can only be done from code. Зарегистрировать события на временной шкале можно как в коде, так и в разметке.You can register for events with a timeline from markup or code. В следующем разделе описано, как зарегистрировать события часов на временной шкале.The next section describes how to register for clock events with a timeline.

Регистрация событий часов на временной шкалеRegistering for Clock Events with a Timeline

Несмотря на то что временной шкалы Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidated, и RemoveRequested события могут быть связаны с временной шкалой, регистрация для этих событий фактически связывает обработчик событий с Clock созданным для временной шкалы.Although a timeline's Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidated, and RemoveRequested events appear to be associated with the timeline, registering for these events actually associates an event handler with the Clock created for the timeline.

При регистрации для Completed события на временной шкале, например, фактически дается система для регистрации Completed событий всех часов, которая создается для временной шкалы.When you register for the Completed event on a timeline, for example, you're actually telling the system to register for the Completed event of each clock that is created for the timeline. В коде, необходимо зарегистрировать для этого события перед Clock создается для этой шкалы времени; в противном случае вы не получите уведомление.In code, you must register for this event before the Clock is created for this timeline; otherwise, you won't receive notification. Это происходит автоматически в XAMLXAML; средство синтаксического анализа автоматически регистрирует событие до Clock создается.This happens automatically in XAMLXAML; the parser automatically registers for the event before the Clock is created.

См. такжеSee also