Как изменить продолжительность DoubleAnimation Binding?
У меня есть такой эллипс:
<Ellipse Width="40" Height="50" Fill="Green">
<Ellipse.RenderTransform>
<RotateTransform Angle="0" CenterX="20" CenterY="25" />
</Ellipse.RenderTransform>
<Ellipse.Triggers>
<EventTrigger RoutedEvent="Ellipse.Loaded" >
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="RenderTransform.Angle"
From="0" To="360" Duration="{Binding Path=Dudu}" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Ellipse.Triggers>
</Ellipse>
Я хочу, чтобы эллипс вращался со скоростью в зависимости от Dudu
свойство (это свойство использовать INotifyPropertyChanged
уведомить изменилось).
Но продолжительность не меняется, когда я меняю значение Dudu
, Я понял, проблема в том, Loaded
Событие просто поднять в первый раз, загружается только элемент управления.
Мой вопрос: как я могу изменить длительность путем изменения значения свойства? Какое событие я должен использовать?
1 ответ
Я думаю, что проблема может быть с таможенной собственностью Dudu
сам. посмотрите, правильно ли он решен и имеет ли он правильный тип
Я попытался создать альтернативное решение, если выше не работает
вот пример с использованием прикрепленного поведения
<Ellipse Width="40"
Height="50"
Fill="Green"
xmlns:l="clr-namespace:CSharpWPF"
l:AnimationHelper.AnimationDuration="0:0:2">
<Ellipse.RenderTransform>
<RotateTransform Angle="0"
CenterX="20"
CenterY="25" />
</Ellipse.RenderTransform>
</Ellipse>
обратите внимание, что я удалил триггер с раскадровкой и прикрепил свойство AnimationHelper.AnimationDuration="0:0:2"
Вы можете связать это как AnimationHelper.AnimationDuration="{Binding Path=Dudu}"
Класс AnimationHelper
namespace CSharpWPF
{
public class AnimationHelper : DependencyObject
{
public static Duration GetAnimationDuration(DependencyObject obj)
{
return (Duration)obj.GetValue(AnimationDurationProperty);
}
public static void SetAnimationDuration(DependencyObject obj, Duration value)
{
obj.SetValue(AnimationDurationProperty, value);
}
// Using a DependencyProperty as the backing store for AnimationDuration.
// This enables animation, styling, binding, etc...
public static readonly DependencyProperty AnimationDurationProperty =
DependencyProperty.RegisterAttached("AnimationDuration", typeof(Duration),
typeof(AnimationHelper), new PropertyMetadata(Duration.Automatic,
OnAnimationDurationChanged));
private static void OnAnimationDurationChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
FrameworkElement element = d as FrameworkElement;
element.Loaded += (s, arg) => element.RenderTransform.BeginAnimation(
RotateTransform.AngleProperty,
new DoubleAnimation(0, 360, (Duration)e.NewValue)
{ RepeatBehavior = RepeatBehavior.Forever });
}
}
}
Также обратите внимание, что в приведенном выше примере используется жестко заданная DoubleAnimation для свойства RenderTransform. Предполагая, что RenderTransform инициализируется с экземпляром RotateTransform. Вы также можете расширить поведение, сделав его динамическим, если это необходимо.