我有一个将RepeatBehavior设置为Forever的WPF动画。每次重复动画时都需要更新某些内容。我无法弄清楚如何捕获重复事件,Complete事件处理程序不适用于此。动画间隔是可编程的,并由一些环境因素决定。所以使用计时器不是一个简洁的方法。我怎么能这样做?
答案 0 :(得分:0)
不要使用Forever的RepeatBehavior,只需运行一次,然后捕获Completed事件。进行处理,然后使用正确的DependencyProperty和动画调用BeginAnimation。
例如,这是一个(无可否认的愚蠢)例子来表明我的意思。
XAML:
<TextBlock x:Name="txtExample"
Text="Gradients Are Neat"
FontSize="50">
<TextBlock.Foreground>
<LinearGradientBrush x:Name="rgbForeground">
<LinearGradientBrush.GradientStops>
<GradientStop x:Name="Color1" Color="#12BC23" Offset="0.0" />
<GradientStop x:Name="Color2" Color="#AA0499" Offset="0.5" />
<GradientStop x:Name="Color3" Color="#792BDF" Offset="1.0" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</TextBlock.Foreground>
<TextBlock.Triggers>
<EventTrigger RoutedEvent="TextBlock.Loaded">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard x:Name="SomeStoryboard">
<ColorAnimation x:Name="changeColor1"
Storyboard.TargetName="Color1"
Storyboard.TargetProperty="Color"
Duration="0:0:3"
To="#81AD21"/>
<ColorAnimation x:Name="changeColor2"
Storyboard.TargetName="Color2"
Storyboard.TargetProperty="Color"
Duration="0:0:2"
To="#29910A"/>
<ColorAnimation x:Name="changeColor3"
Storyboard.TargetName="Color3"
Storyboard.TargetProperty="Color"
Duration="0:0:5"
To="#BB4923"
Completed="changeColor3JustOnce_Completed" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</TextBlock.Triggers>
</TextBlock>
代码背后:
private void changeColor3_Completed(object sender, EventArgs e)
{
Color3.BeginAnimation(GradientStop.ColorProperty, changeColor3);
}
请注意,尽管已在动画中声明,但已完成事件位于故事板上。如果您在其他一些动画中将RepeatForever设置为true,则永远不会触发该事件。
答案 1 :(得分:0)
我找到了一个相当优雅的解决方案。它只需要向CurrentTimeInvalidated
元素上的Timeline
事件添加EventHandler:
private TimeSpan _lastTime;
private void Animation_CurrentTimeInvalidated(object sender, EventArgs e)
{
var clock = sender as AnimationClock;
if (clock != null && clock.CurrentTime.HasValue)
{
if (clock.CurrentTime.Value < this._lastTime)
{
//TODO: Add any behavior to perform on a repeat here.
}
this._lastTime = clock.CurrentTime.Value;
}
}