我有一个将RepeatBehavior设置为Forever的WPF动画。每次动画重复时都需要更新。我无法弄清楚如何捕捉重复事件,完整的事件处理程序不适用于此。动画间隔是可编程的,并由一些环境因素决定。所以使用定时器并不是一个整洁的方法。我怎样才能做到这一点?如何在重复WPF动画时触发事件处理程序
0
A
回答
0
而不是有一个永远的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,则该事件永远不会被触发。
0
我发现了一个相当优雅的解决方案来解决这个问题。它只需要Timeline
元素添加事件处理程序的CurrentTimeInvalidated
事件:
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;
}
}
相关问题
- 1. WPF画布的PreviewMouseWheel事件处理程序不会触发事件
- 2. 如何在更改字段时触发事件处理程序?
- 3. ASP.NET控件事件处理程序在回发时未触发?
- 4. 事件处理程序触发System.StackOverflowException
- 5. Javascript事件处理程序未触发
- 6. Sharepoint事件处理程序未触发
- 7. 事件处理程序自动点击事件触发 - jQuery的
- 8. wpf事件处理程序
- 9. WPF:如何从事件处理程序中获取触发动画的控件的名称?
- 10. 重新触发WPF动画
- 11. WPF触摸/摇摄滚动事件处理程序
- 12. 如何在事件处理程序被触发后删除它?
- 13. 如何在Silverlight中触发PropertyChanged事件处理程序一次?
- 14. 如何使用PyGTK事件处理程序手动触发事件?
- 15. 在事件处理程序中触发javascript默认动作
- 16. 在一段时间后触发事件处理程序
- 17. jQuery事件处理程序有时在IE中没有触发
- 18. WPF动画结束时是否有任何事件触发?
- 19. NullReferenceExeption在事件触发时未处理
- 20. SVPullToRefresh在触发时不会触发动作处理程序
- 21. C#/ WPF:事件处理只触发时在子元素
- 22. 如何在事件处理程序中触发元素的默认事件?
- 23. jQuery:如何停止从blur()处理程序触发change()事件?
- 24. Excel vba -get触发事件处理程序时的ActiveX控件复选框
- 25. Form OnClick事件处理程序 - 如何重叠其他事件处理程序?
- 26. 重置触摸事件的事件处理程序
- 27. 动态添加的事件处理程序不会触发
- 28. 自动化事件处理程序被触发不止一次
- 29. Meta标签的自动触发HTML事件处理程序
- 30. wpf动画事件重叠
这恰恰是我的方式。我使用相同的BeginTime和Duration定义了另一个动画,因为我不确定时序是否足够精确。目前它工作正常。谢谢。 – Hugo 2010-04-20 02:02:09