計時事件概觀

本主題描述如何使用 和 Clock 物件上 Timeline 可用的五個計時事件。

必要條件

若要了解本主題,您應該了解如何建立及使用動畫。 若要開始使用動畫,請參閱 動畫概觀

WPF 中有多種方式可以建立屬性的動畫效果:

因為您可以在標記和程式碼中使用它們,因此此概觀中的範例會使用 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

如需更完整的範例,請參閱 在時鐘的狀態變更時接收通知

公用事件

TimelineClock 類別都提供五個計時事件。 下表列出這些事件和觸發它們的條件。

Event 觸發互動式作業 其他觸發程序
已完成 跳至填滿 時鐘完成。
CurrentGlobalSpeedInvalidated 暫停、繼續、搜尋、設定速率、跳至填滿、停止 時鐘反轉、加速、啟動或停止。
CurrentStateInvalidated 開始、跳至填滿、停止 時鐘啟動、停止或填滿。
CurrentTimeInvalidated 開始、搜尋、跳至填滿、停止 時鐘進行。
RemoveRequested 移除

滴答和事件彙總

當您在 WPF 中建立物件動畫時,它是管理動畫的計時引擎。 計時引擎會追蹤時間的進展,並計算每個動畫的狀態。 它在一秒內會做出許多這種評估處理。 這些評估處理稱為「滴答」。

雖然滴答經常發生,但有很多事可能會在滴答之間發生。 例如,時間軸可能會停止,啟動,然後再次停止,在此情況下,它的目前狀態已變更三次。 理論上,事件可以在單一滴答中引發很多次,不過,由於計時引擎會彙總事件,所以每個事件在每次滴答中最多只能引發一次。

註冊事件

有兩種方式可以註冊計時事件:使用時間軸來註冊,或使用從時間軸建立的時鐘來註冊。 使用時鐘直接註冊事件很簡單,但是只能透過程式碼來完成。 您可以透過標記或程式碼來使用時間軸註冊事件。 下節會說明使用時間軸註冊時鐘事件的方法。

使用時間軸註冊時鐘事件

雖然時間軸的 CompletedCurrentGlobalSpeedInvalidatedCurrentStateInvalidatedCurrentTimeInvalidatedRemoveRequested 事件似乎與時間軸相關聯,但註冊這些事件實際上會將事件處理常式與 Clock 為時程表建立的 關聯。

例如,當您在時間軸上註冊 Completed 事件時,實際上會告知系統註冊 Completed 時間軸所建立之每個時鐘的事件。 在程式碼中,您必須先註冊此事件,才能 Clock 建立此時間軸,否則您不會收到通知。 這會在 XAML 中自動發生;剖析器會在建立 之前 Clock 自動註冊事件。

另請參閱