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