Общие сведения о временных событиях
В этом разделе описываются способы использования пяти временных событий, доступных на Timeline и Clock объектов.
Предварительные требования
Для понимания этого раздела вы должны знать, как создавать и использовать анимации. Чтобы приступить к работе с анимацией, см. в разделе Общие сведения об анимации.
Существует несколько способов анимирования свойств в WPF:
Использование объектов раскадровки (разметки и кода): Можно использовать Storyboard упорядочить анимации для одного или нескольких объектов и объектов. Например, см. в разделе анимация свойства с помощью раскадровки.
Использование локальных анимаций (только в коде): Можно применить AnimationTimeline объекты непосредственно к анимируемым свойствам. Пример см. в разделе Анимация свойства без использования раскадровки.
Использование часов (только в коде): Кроме того, можно явно управлять созданием часов и самостоятельно распределять часы для анимации. Например, см. в разделе Анимирование свойства с помощью AnimationClock.
Так как их можно использовать в разметке и коде, в примерах в этом обзоре используются Storyboard объектов. Тем не менее описанные здесь идеи также применяются к другим методам анимирования свойств.
Что такое часы?
Временная шкала сама по себе просто описывает сегмент времени. Он является временной шкалы Clock объект, который не работает: он обеспечивает связана со временем состояние времени выполнения для временной шкалы. В большинстве случаев, например при использовании раскадровок, часы для временной шкалы создаются автоматически. Вы также можете создать Clock явным образом с помощью CreateClock метод. Дополнительные сведения о Clock объектов, см. в разделе анимации и общие сведения о характере системы.
Зачем использовать события?
Все интерактивные временные операции являются асинхронными. Исключение составляет лишь поиск, который выравнивается по последнему такту. Точно определить, когда будут выполнены операции, невозможно. При наличии другого кода, который зависит от вашей операции, это может вызвать проблемы. Предположим, что вы хотите остановить временную шкалу, которая анимировала прямоугольник. После остановки временной шкалы вы изменяете цвет прямоугольника.
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);
// 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;
}
}
Более полный пример, см. в разделе получения уведомлений при изменениях состояния часов.
Открытые события
Timeline И Clock классы предоставляют пять временных событий. В следующей таблице перечислены эти события и условия, которые их вызывают.
событие | Интерактивная операция, вызывающая событие | Другие условия |
---|---|---|
Завершено | Переход к заполнению | Часы останавливаются. |
CurrentGlobalSpeedInvalidated | Пауза, возобновление, поиск, установка соотношения скорости, переход к заполнению | Часы запускаются в обратном направлении, ускоряются, запускаются в обычном направлении или останавливаются. |
CurrentStateInvalidated | Начало, переход к заполнению, остановка | Часы запускаются, останавливаются, или выполняется заполнение. |
CurrentTimeInvalidated | Начало, поиск, переход к заполнению, остановка | Часы работают. |
RemoveRequested | Удалить |
Такты и объединение событий
При анимации объектов в WPF, обработчик синхронизации управляет анимациями. Система управления временем отслеживает ход времени и вычисляет состояние каждой анимации. Она выполняет эти действия несколько раз в секунду. Такие вычислительные проходы называются "тактами".
Хотя такты меняются часто, между ними может возникать множество событий. Например, временная шкала может быть остановлена, запущена и снова остановлена, в этом случае ее состояние будет изменено три раза. Теоретически событие может вызываться несколько раз в одном такте. Однако система управления временем объединяет события, чтобы каждое событие могло происходить не более одного раза за такт.
Регистрация в событиях
Существует два способа регистрации временных событий: их можно зарегистрировать на временной шкале и на часах, созданных на основе временной шкалы. Регистрация события непосредственно на часах достаточно проста, но ее можно выполнить только в коде. Зарегистрировать события на временной шкале можно как в коде, так и в разметке. В следующем разделе описано, как зарегистрировать события часов на временной шкале.
Регистрация событий часов на временной шкале
Несмотря на то что временной шкалы Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidated, и RemoveRequested события могут быть связаны с временной шкалой, регистрация для этих событий фактически связывает обработчик событий с Clock созданным для временной шкалы.
При регистрации для Completed события на временной шкале, например, фактически дается система для регистрации Completed событий всех часов, которая создается для временной шкалы. В коде, необходимо зарегистрировать для этого события перед Clock создается для этой шкалы времени; в противном случае вы не получите уведомление. Это происходит автоматически в XAML; средство синтаксического анализа автоматически регистрирует событие до Clock создается.