計時事件概觀

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

Prerequisites

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

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

因為您可以在標記和程式碼中使用它們,所以本總覽中的範例會使用 Storyboard 物件。 不過,所述的概念也可以套用到其他建立屬性動畫的方法。

什麼是時鐘?

它是時間軸。單獨使用時,它除了描述一段時間之外沒有任何其他功能。 它是 Clock 執行實際工作的時程表物件:它會維護時間軸的時間相關執行時間狀態。 在大部分情況下 (例如使用分鏡腳本時),系統會自動為時間軸建立時鐘。 您也可以 Clock 使用方法明確建立 CreateClock 。 如需物件的詳細資訊 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 類別都提供五個計時事件。 下表列出這些事件和觸發它們的條件。

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

滴答和事件彙總

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

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

註冊事件

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

使用時間軸註冊時鐘事件

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

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

另請參閱