我有一個將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