Если нужно, чтобы анимация повторялась несколько раз (или никогда не прекращалась), тогда можно воспользоваться свойством 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> и понаблюдать за поведением.
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="200" Width="600" WindowStartupLocation="CenterScreen"
Title="Growing Label Font!">
RepeatBehavior="Forever"/>
А теперь подробно разберем пример.
Роль раскадровок
При продвижении от самого глубоко вложенного элемента наружу первым встречается элемент
, обращающийся к тем же самым свойствам, которые устанавливались в процедурном коде(From
, То
, Duration
и RepeatBehavior
):
RepeatBehavior="Forever"/>
Как упоминалось ранее, элементы Animation
помещаются внутрь элемента Storyboard
, применяемого для отображения объекта анимации на заданное свойство родительского типа через свойство TargetProperty
, которым в данном случае является FontSize
. Элемент Storyboard
всегда находится внутри родительского элемента по имени BeginStoryboard
:
RepeatBehavior="Forever"/>
Роль триггеров событий