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