Язык программирования C#9 и платформа .NET5
Шрифт:
Свойства То, From и By
Во всех классах
Animation
определены следующие ключевые свойства, которые управляют начальным и конечным значениями, применяемыми для выполнения анимации: •
То
— представляет конечное значение анимации; •
From
— представляет начальное значение анимации; •
By
— представляет общую величину, на которую анимация изменяет начальное значение. Несмотря на тот факт, что все классы поддерживают свойства
То
, From
By
, они не получают их через виртуальные члены базового класса. Причина в том, что лежащие в основе типы, упакованные внутри указанных свойств, варьируются в широких пределах (целые числа, цвета, объекты Thickness
и т.д.), и представление всех возможностей через единственный базовый класс привело бы к очень сложным кодовым конструкциям. В связи со сказанным может возникнуть вопрос: почему не использовались обобщения .NET для определения единственного обобщенного класса анимации с одиночным параметром типа (скажем,
Animate<T>
)? Опять-таки, поскольку существует огромное количество типов данных (цвета, векторы, целые числа, строки и т.д.), применяемых для анимации свойств зависимости, решение оказалось бы не настолько ясным, как можно было бы ожидать (не говоря уже о том, что XAML обеспечивает лишь ограниченную поддержку обобщенных типов). Роль базового класса Timeline
Хотя для определения виртуальных свойств
То
, From
и By
не использовался единственный базовый класс, классы Animation
все же разделяют общий базовый класс — System.Windows.Media.Animation.Timeline
. Данный тип предлагает набор дополнительных свойств, которые управляют темпом продвижения анимации (табл. 27.1). Реализация анимации в коде C#
Вы построите окно, содержащее элемент
Button
, который обладает довольно странным поведением: когда на него наводится курсор мыши, он вращается вокруг своего левого верхнего угла. Начните с создания в Visual Studio нового проекта приложения WPF по имени SpinningButtonAnimationApp
. Модифицируйте начальную разметку, как показано ниже (обратите внимание на обработку события MouseEnter
кнопки):
<Button x:Name="btnSpinner" Height="50" Width="100" Content="I Spin!"
MouseEnter="btnSpinner_MouseEnter" Click="btnSpinner_OnClick"/>
В файле отделенного кода импортируйте пространство имен
System.Windows.Media.Animation
и добавьте в файл C# следующий код:
private bool _isSpinning=false;
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.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
Поделиться:
Популярные книги
Жалкая
3. Долго и Несчастливо
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Беглец
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Академия проклятий. Книги 1 - 7
Академия Проклятий
Фантастика:
фэнтези
8.98
рейтинг книги
Измена. Верни мне мою жизнь
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена
Любовные романы:
современные любовные романы
5.38
рейтинг книги
Гардемарин Ее Величества. Инкарнация
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Сердце для стража
5. Девятый
Фантастика:
фэнтези
боевая фантастика
9.20
рейтинг книги
Черный Маг Императора 11
11. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Имя нам Легион. Том 3
3. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Жена фаворита королевы. Посмешище двора
Фантастика:
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 5
5. Как я строил магическую империю
Фантастика:
попаданцы
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Блуждающие огни 2
2. Блуждающие огни
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Ратник
3. Помещик
Фантастика:
альтернативная история
7.11
рейтинг книги
Маленькая слабость Дракона Андреевича
1. Танцы на углях
Любовные романы:
современные любовные романы
эро литература
5.25