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