我有一個將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. ASP.NET控件事件處理程序在回發時未觸發?
- 2. 事件處理程序觸發System.StackOverflowException
- 3. Sharepoint事件處理程序未觸發
- 4. Javascript事件處理程序未觸發
- 5. WPF:如何從事件處理程序中獲取觸發動畫的控件的名稱?
- 6. WPF觸摸/搖攝滾動事件處理程序
- 7. 在事件處理程序中觸發javascript默認動作
- 8. jQuery事件處理程序有時在IE中沒有觸發
- 9. 在一段時間後觸發事件處理程序
- 10. WPF動畫結束時是否有任何事件觸發?
- 11. SVPullToRefresh在觸發時不會觸發動作處理程序
- 12. C#/ WPF:事件處理只觸發時在子元素
- 13. Excel vba -get觸發事件處理程序時的ActiveX控件複選框
- 14. jQuery:如何停止從blur()處理程序觸發change()事件?
- 15. 重置觸摸事件的事件處理程序
- 16. 動態添加的事件處理程序不會觸發
- 17. wpf動畫事件重疊
- 18. 事件處理程序有時不會觸發C#
- 19. WPF彈出式事件處理 - 如何在彈出窗口打開時觸發
- 20. 如何觸發另一個事件中的事件處理程序,C#
- 21. 如何在TcxGrid中的值發生更改後觸發事件處理程序?
- 22. Silverlight:MouseLeftButtonDown定時器重複觸發事件
- 23. 如何僅當事件按特定順序發生時觸發jquery事件處理程序?
- 24. 如果在事件處理程序中調用wx.PostEvent不會觸發事件?
- 25. 如何確定在JavaScript或jQuery中觸發事件處理程序的順序?
- 26. Wpf DataTemplate事件處理程序
- 27. WPF命令Click事件處理程序
- 28. WPF中的事件處理程序
- 29. 當事件處理程序沒有完成時事件是否被觸發?
- 30. 觸及UIImageView的事件處理程序
這恰恰是我的方式。我使用相同的BeginTime和Duration定義了另一個動畫,因爲我不確定時序是否足夠精確。目前它工作正常。謝謝。 – Hugo 2010-04-20 02:02:09