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

Обновлен: Ноябрь 2007

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

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

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

В WPF существует несколько способов анимации свойств.

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

Часы

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

Смысл использования событий

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

myStoryboard.Stop(myRectangle);

// This statement might execute
// before the storyboard has stopped.
myRectangle.Fill = Brushes.Blue;

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

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

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


...


// Register for the CurrentStateInvalidated timing event.
myStoryboard.CurrentStateInvalidated += new EventHandler(myStoryboard_CurrentStateInvalidated);

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

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

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

Событие

Вызывающая интерактивная операция

Другие триггеры

Завершено

Переход к заполнению

Время истекло.

CurrentGlobalSpeedInvalidated

Приостановка, возобновление, поиск, задание отношения скоростей, переход к заполнению, остановка

Обращение, ускорение, запуск или остановка часов.

CurrentStateInvalidated

Начало, переход к заполнению, остановка

Запуск, остановка или заполнение часов.

CurrentTimeInvalidated

Начало, поиск, переход к заполнению, остановка

Продвижение часов вперед.

RemoveRequested

Удалить

Временные такты и объединение событий

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

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

Регистрация для событий

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

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

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

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

См. также

Основные понятия

Общие сведения об анимации и системе управления временем

Общие сведения об эффектах анимации

Общие сведения о характере поведения во времени

Другие ресурсы

Пример анимации и использования таймера