Язык программирования C#9 и платформа .NET5
На заметку! В подкаталоге
внутриXamlAnimationsесть несколько файлов XAML. Скопируйте их содержимое в редактор Kaxaml, чтобы просмотреть результаты.Chapter_27Большей частью создание анимации подобно всему тому, что вы уже видели: по-прежнему производится конфигурирование объекта
, который затем ассоциируется со свойством объекта. Тем не менее, крупное отличие связано с тем, что разметка XAML не является дружественной к вызовам методов. В результате вместо вызоваAnimationиспользуется раскадровка как промежуточный уровень.BeginAnimation()Давайте рассмотрим полный пример анимации, определенной в терминах XAML, и подробно ее проанализируем. Приведенное далее определение XAML будет отображать окно, содержащее единственную метку. После того как объект
загрузился в память, он начинает анимационную последовательность, во время которой размер шрифта увеличивается от 12 до 100 точек за период в четыре секунды. Анимация будет повторяться столько времени, сколько объект остается загруженным в память. Разметка находится в файлеLabel, так что его содержимое необходимо скопировать в редактор Kaxaml, нажать клавишу <F5> и понаблюдать за поведением.GrowLabelFont.xaml<Windowxmlns="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!"><StackPanel><Label Content="Interesting..."><Label.Triggers><EventTrigger RoutedEvent="Label.Loaded"><EventTrigger.Actions><BeginStoryboard><Storyboard TargetProperty="FontSize"><DoubleAnimation From="12" To="100" Duration="0:0:4"RepeatBehavior="Forever"/></Storyboard></BeginStoryboard></EventTrigger.Actions></EventTrigger></Label.Triggers></Label></StackPanel></Window>А теперь подробно разберем пример.
Роль раскадровок
При продвижении от самого глубоко вложенного элемента наружу первым встречается элемент
, обращающийся к тем же самым свойствам, которые устанавливались в процедурном коде(<DoubleAnimation>,From,ТоиDuration):RepeatBehavior<DoubleAnimation From="12" To="100" Duration="0:0:4"RepeatBehavior="Forever"/>Как упоминалось ранее, элементы
помещаются внутрь элементаAnimation, применяемого для отображения объекта анимации на заданное свойство родительского типа через свойствоStoryboard, которым в данном случае являетсяTargetProperty. ЭлементFontSizeвсегда находится внутри родительского элемента по имениStoryboard:BeginStoryboard<BeginStoryboard><Storyboard TargetProperty="FontSize"><DoubleAnimation From="12" To="100" Duration="0:0:4"RepeatBehavior="Forever"/></Storyboard></BeginStoryboard>Роль триггеров событий
После того как элемент
определен, должно быть указано действие какого-то вида, которое приведет к запуску анимации. Инфраструктура WPF предлагает несколько разных способов реагирования на условия времени выполнения в разметке, один из которых называется триггером. С высокоуровневой точки зрения триггер можно считать способом реагирования на событие в разметке XAML без необходимости в написании процедурного кода.BeginStoryboardОбычно когда ответ на событие реализуется в С#, пишется специальный код, который будет выполнен при поступлении события. Однако триггер — всего лишь способ получить уведомление о том, что некоторое событие произошло (загрузка элемента в память, наведение на него курсора мыши, получение им фокуса и т.д.).
Получив уведомление о появлении события, можно запускать раскадровку. В показанном ниже примере обеспечивается реагирование на факт загрузки элемента
в память. Поскольку вас интересует событиеLabelэлементаLoaded, элементLabelпомещается в коллекцию триггеров элементаEventTrigger:Label<Label Content="Interesting..."><Label.Triggers><EventTrigger RoutedEvent="Label.Loaded"><EventTrigger.Actions><BeginStoryboard><Storyboard TargetProperty="FontSize">