我有一个像这样的椭圆:
<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
事件仅在第一次加载控件时才会加载。
我的问题是:如何通过更改属性值来更改持续时间?我应该使用什么事件?
答案 0 :(得分:2)
我认为问题可能在于绑定属性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 });
}
}
}
另请注意,上面的示例在RenderTransform属性上使用了硬编码的DoubleAnimation。假设使用RotateTransform实例初始化RenderTransform。如果需要,你也可以扩展行为使其动态化。