Книги онлайн и без регистрации » Разная литература » Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 347 348 349 350 351 352 353 354 355 ... 407
Перейти на страницу:
var dblAnim=new DoubleAnimation();

    dblAnim.Completed +=(o, s)=> { _isSpinning=false; };

    // Установить начальное и конечное значения.

    dblAnim.From=0;

    dblAnim.To=360;

    // Создать объект RotateTransform и присвоить

    // его свойству RenderTransform кнопки.

    var rt=new RotateTransform();

    btnSpinner.RenderTransform=rt;

    // Выполнить анимацию объекта RotateTransform.

    rt.BeginAnimation(RotateTransform.AngleProperty, dblAnim);

  }

}

private void btnSpinner_OnClick(

  object sender, RoutedEventArgs e)

{

}

Первая крупная задача метода btnSpinner_MouseEnter() связана с конфигурированием объекта DoubleAnimation, который будет начинать со значения 0 и заканчивать значением 360. Обратите внимание, что для этого объекта также обрабатывается событие Completed, где переключается булевская переменная уровня класса, которая применяется для того, чтобы выполняющаяся анимация не была сброшена в начало.

Затем создается объект RotateTransform, который подключается к свойству RenderTransform элемента управления Button (btnSpinner). Наконец, объект RenderTransform информируется о начале анимации его свойства Angle с использованием объекта DoubleAnimation. Реализация анимации в коде обычно осуществляется путем вызова метода BeginAnimation() и передачи ему лежащего в основе свойства зависимости, к которому необходимо применить анимацию (вспомните, что по соглашению оно определено как статическое поле класса), и связанного объекта анимации.

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

private void btnSpinner_OnClick(

  object sender, RoutedEventArgs e)

{

  var dblAnim=new DoubleAnimation

  {

    From=1.0,

    To=0.0

  };

  btnSpinner.BeginAnimation(Button.OpacityProperty, dblAnim);

}

В коде обработчика события btnSpinner_Click() изменяется свойство Opacity, чтобы постепенно скрыть кнопку из виду. Однако в настоящий момент это затруднительно, потому что кнопка вращается слишком быстро. Как можно управлять ходом анимации? Ответ на вопрос ищите ниже.

Управление темпом анимации

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

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

private void btnSpinner_MouseEnter(

  object sender, MouseEventArgs e)

{

  if (!_isSpinning)

   {

    _isSpinning=true;

    // Создать объект DoubleAnimation и зарегистрировать

    // его с событием Completed.

    var dblAnim=new DoubleAnimation();

    dblAnim.Completed +=(o, s)=> { _isSpinning=false; };

    // На завершение поворота кнопке отводится четыре секунды.

    dblAnim.Duration=new Duration(TimeSpan.FromSeconds(4));

    ...

  }

}

Благодаря такой модификации у вас должен появиться шанс щелкнуть на кнопке во время ее вращения, после чего она плавно исчезнет.

На заметку! Свойство BeginTime класса Animation также принимает объект TimeSpan. Вспомните, что данное свойство можно устанавливать для указания времени ожидания перед запуском анимационной последовательности.

Запуск в обратном порядке и циклическое выполнение анимации

За счет установки в true свойства AutoReverse объектам Animation указывается о необходимости запуска анимации в обратном порядке по ее завершении. Например, если необходимо, чтобы кнопка снова стала видимой после исчезновения, можно написать следующий код:

private void btnSpinner_OnClick(object sender, RoutedEventArgs e)

{

  DoubleAnimation dblAnim=new DoubleAnimation

  {

    From=1.0,

    To=0.0

  };

  // После завершения запустить в обратном порядке.

  dblAnim.AutoReverse=true;

  btnSpinner.BeginAnimation(Button.OpacityProperty, dblAnim);

}

Если нужно, чтобы анимация повторялась несколько раз (или никогда не прекращалась), тогда можно воспользоваться свойством RepeatBehavior, общим для всех классов Animation. Передавая конструктору простое числовое значение, можно указать жестко закодированное количество повторений. С другой стороны, если передать конструктору объект TimeSpan, то можно задать время, в течение которого анимация должна повторяться. Наконец, чтобы выполнять анимацию бесконечно, свойство RepeatBehavior можно установить в RepeatBehavior.Forever. Взгляните на следующие способы изменения поведения повтора одного из двух объектов DoubleAnimation, применяемых в примере:

// Повторять бесконечно.

dblAnim.RepeatBehavior=RepeatBehavior.Forever;

// Повторять три раза.

dblAnim.RepeatBehavior=new RepeatBehavior(3);

// Повторять в течение 30 секунд.

dblAnim.RepeatBehavior=new RepeatBehavior(TimeSpan.FromSeconds(30));

Итак, исследование приемов добавления анимации к аспектам какого-то объекта с использованием кода C# и API-интерфейса анимации WPF завершено. Теперь посмотрим, как делать то же самое с помощью разметки XAML.

Реализация анимации в разметке XAML

Реализация анимации в разметке подобна ее реализации в коде, по крайней мере, для простых анимационных последовательностей. Когда необходимо создать более сложную анимацию, которая включает изменение значений множества свойств одновременно, объем разметки может заметно увеличиться. Даже в случае применения какого-то инструмента для генерирования анимации, основанной на разметке XAML, важно знать основы представления анимации в XAML, поскольку тогда облегчается задача модификации и настройки сгенерированного инструментом содержимого.

На заметку! В подкаталоге XamlAnimations внутри Chapter_27 есть несколько файлов XAML. Скопируйте их содержимое в редактор Kaxaml, чтобы просмотреть результаты.

Большей частью создание анимации подобно всему тому, что вы уже видели: по-прежнему производится конфигурирование объекта Animation, который затем ассоциируется со свойством объекта. Тем не менее, крупное отличие связано с тем, что разметка XAML не является дружественной к вызовам методов. В результате вместо вызова BeginAnimation() используется раскадровка как промежуточный уровень.

Давайте рассмотрим полный пример анимации, определенной в терминах XAML, и подробно ее проанализируем. Приведенное далее определение XAML будет отображать окно, содержащее единственную метку. После того как объект Label загрузился в память, он начинает анимационную последовательность, во время которой размер шрифта увеличивается от 12 до 100 точек за период в четыре секунды. Анимация будет повторяться столько времени, сколько объект остается загруженным в память. Разметка находится в файле GrowLabelFont.xaml, так что его содержимое необходимо скопировать в редактор Kaxaml, нажать клавишу <F5> и понаблюдать за поведением.

1 ... 347 348 349 350 351 352 353 354 355 ... 407
Перейти на страницу:

Комментарии
Минимальная длина комментария - 20 знаков. В коментария нецензурная лексика и оскорбления ЗАПРЕЩЕНЫ! Уважайте себя и других!
Комментариев еще нет. Хотите быть первым?