Запуск анимации XAML в WPF
Я использую это в качестве основы, чтобы сделать анимацию начать использовать код позади. Исходя из содержания статьи, у меня есть следующее:
<Window.Resources>
<Storyboard x:Key="sbdLabelRotation">
<DoubleAnimation
Storyboard.TargetName="lblHello"
Storyboard.TargetProperty="(TextBlock.RenderTransform).(RotateTransform.Angle)"
From="0"
To="360"
Duration="0:0:0.5"
RepeatBehavior="4x" />
</Storyboard>
</Window.Resources>
У меня есть следующий XAML (очевидно):
<Label x:Name="lblHello" Content="test" Margin="20"/>
И код за ним:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public void AnimateLabelRotation()
{
Storyboard sbdLabelRotation = (Storyboard)FindResource("sbdLabelRotation");
sbdLabelRotation.Begin(this);
}
Который я вызываю из события нажатия кнопки. FindResource работает и находит раскадровку, но ничего не происходит. Мне удалось заставить анимацию работать на триггере события, но очевидно, что я упускаю что-то для кода позади.
2 ответов:
Это:
<Label x:Name="lblHello" Content="test" Margin="20"/>И это:
Storyboard.TargetProperty="(TextBlock.RenderTransform).(RotateTransform.Angle)"Несовместимы.
Когда анимация пытается найти свойство для анимации, она переходит к
(TextBlock.RenderTransform)и находит null, так как вы его не объявляли (на самом деле это не так, поскольку вы говорите TextBlock, но применяете его к Label, подробнее об этом позже в ответе). Таким образом, он не может найти.(RotateTransform.Angle).Чтобы исправить проблему:
<Label x:Name="lblHello" Content="test" Margin="20" RenderTransformOrigin="0.5,0.5"> <Label.RenderTransform> <RotateTransform /> </Label.RenderTransform> </Label>Обратите внимание
RenderTransformOriginустановка-это означает, что ось вращения будет находиться в центре объекта (X и Год).Кроме того, в анимации это должно быть:
Storyboard.TargetProperty="(Label.RenderTransform).(RotateTransform.Angle)"
Есть ссылка для загрузки всего проекта http://www.galasoft.ch/mydotnet/articles/resources/article-2006102701/GalaSoftLb.Article2006102701.zip
Вы можете изучить код и увидеть, как он работает. Иногда это более полезно. Также в вашем коде часть:
sbdLabelRotation.Begin(this);Может ошибаться. Как вы знаете, ключевое слово
thisссылается на сам класс, в вашем случае на классMainWindow. Вы должны попробовать без этого ключевого слова.
Comments