計時事件概觀
本主題會描述如何使用 Timeline 和 Clock 物件上可用的五個計時事件。
必要條件
若要了解本主題,您應該了解如何建立及使用動畫。 若要開始使用動畫,請參閱 動畫概觀。
在 WPF 中為屬性設定動畫有多種方法:
使用分鏡腳本物件 (標記和程式碼)︰您可以使用 Storyboard 物件排列動畫並將動畫散發至一個或多個物件。 如需範例,請參閱 使用分鏡腳本建立屬性的動畫。
使用本機動畫 (僅限程式碼)︰您可以將 AnimationTimeline 物件直接套用至它們設定動畫的屬性。 如需範例,請參閱 不使用分鏡腳本而建立屬性的動畫。
使用時鐘 (僅程式碼)︰您可以明確管理時鐘的建立,並自行發佈動畫時鐘。 如需範例,請參閱 使用 AnimationClock 建立屬性的動畫。
本概觀中的範例將使用 Storyboard 物件,因為您可以在標記和程式碼中使用這些物件。 不過,所述的概念也可以套用到其他建立屬性動畫的方法。
什麼是時鐘?
它是時間軸。單獨使用時,它除了描述一段時間之外沒有任何其他功能。 實際執行工作的是時間軸的 Clock 物件: 它會維護時間軸的計時相關執行階段狀態。 在大部分情況下 (例如使用分鏡腳本時),系統會自動為時間軸建立時鐘。 您也可以使用 CreateClock 方法來明確建立 Clock。 如需 Clock 物件的詳細資訊,請參閱動畫和計時系統概觀。
為何要使用事件?
除了一個例外狀況 (對齊最後一個滴答的搜尋) 之外,所有互動式計時作業都是非同步的。 您無法得知它們會在何時執行。 當有其他程式碼需要依賴您的計時作業時,這會構成問題。 假設您要停止對矩形建立動畫的時間軸。 在該時間軸停止之後,您會變更該矩形的色彩。
myStoryboard.Stop(myRectangle);
// This statement might execute
// before the storyboard has stopped.
myRectangle.Fill = Brushes.Blue;
myStoryboard.Stop(myRectangle)
' This statement might execute
' before the storyboard has stopped.
myRectangle.Fill = Brushes.Blue
在上述範例中,第二行的程式碼可能會在分鏡腳本停止前執行。 這是因為停止是一個非同步作業。 要求時間軸或時鐘停止,會建立某種「停止要求」,並需要等到計時引擎的下一個滴答才會處理該要求。
若要在時間軸完成之後執行命令,請使用計時事件。 在下列範例中,在分鏡腳本停止播放之後,會使用事件處理常式來變更矩形的色彩。
// Register for the CurrentStateInvalidated timing event.
myStoryboard.CurrentStateInvalidated += new EventHandler(myStoryboard_CurrentStateInvalidated);
' Register for the CurrentStateInvalidated timing event.
AddHandler myStoryboard.CurrentStateInvalidated, AddressOf myStoryboard_CurrentStateInvalidated
// Change the rectangle's color after the storyboard stops.
void myStoryboard_CurrentStateInvalidated(object sender, EventArgs e)
{
Clock myStoryboardClock = (Clock)sender;
if (myStoryboardClock.CurrentState == ClockState.Stopped)
{
myRectangle.Fill = Brushes.Blue;
}
}
' Change the rectangle's color after the storyboard stops.
Private Sub myStoryboard_CurrentStateInvalidated(ByVal sender As Object, ByVal e As EventArgs)
Dim myStoryboardClock As Clock = CType(sender, Clock)
If myStoryboardClock.CurrentState = ClockState.Stopped Then
myRectangle.Fill = Brushes.Blue
End If
End Sub
如需更完整的範例,請參閱 在時鐘的狀態變更時接收通知。
公用事件
Timeline 和 Clock 類別均提供五個計時事件。 下表列出這些事件和觸發它們的條件。
活動 | 觸發互動式作業 | 其他觸發程序 |
---|---|---|
已完成 | 跳至填滿 | 時鐘完成。 |
CurrentGlobalSpeedInvalidated | 暫停、繼續、搜尋、設定速率、跳至填滿、停止 | 時鐘反轉、加速、啟動或停止。 |
CurrentStateInvalidated | 開始、跳至填滿、停止 | 時鐘啟動、停止或填滿。 |
CurrentTimeInvalidated | 開始、搜尋、跳至填滿、停止 | 時鐘進行。 |
RemoveRequested | 移除 |
滴答和事件彙總
當您在 WPF 中設定物件動畫時,會由計時引擎管理您動畫。 計時引擎會追蹤時間的進展,並計算每個動畫的狀態。 它在一秒內會做出許多這種評估處理。 這些評估處理稱為「滴答」。
雖然滴答經常發生,但有很多事可能會在滴答之間發生。 例如,時間軸可能會停止,啟動,然後再次停止,在此情況下,它的目前狀態已變更三次。 理論上,事件可以在單一滴答中引發很多次,不過,由於計時引擎會彙總事件,所以每個事件在每次滴答中最多只能引發一次。
註冊事件
有兩種方式可以註冊計時事件:使用時間軸來註冊,或使用從時間軸建立的時鐘來註冊。 使用時鐘直接註冊事件很簡單,但是只能透過程式碼來完成。 您可以透過標記或程式碼來使用時間軸註冊事件。 下節會說明使用時間軸註冊時鐘事件的方法。
使用時間軸註冊時鐘事件
雖然時間軸的 Completed、CurrentGlobalSpeedInvalidated、CurrentStateInvalidated、CurrentTimeInvalidated 和 RemoveRequested 事件似乎與時間軸相關聯,但註冊這些事件實際上會將事件處理常式與為時程軸建立的 Clock 產生關聯。
例如,當您在時間軸上註冊 Completed 事件時,實際上會告知系統註冊時間軸所建立之每個時鐘的 Completed 事件。 在程式碼中,您必須先註冊此事件,才能為此時間軸建立 Clock;否則,您不會收到通知。 這在 XAML 中會自動發生,剖析器會在 Clock 建立之前自動註冊事件。