動畫和計時系統概觀

本主題描述計時系統如何使用動畫、 Timeline 、 和 Clock 類別來建立屬性的動畫效果。

必要條件

若要瞭解本主題,您應該能夠使用 WPF 動畫來建立屬性的動畫效果,如動畫概觀 中所述 。 這也有助於熟悉相依性屬性。如需詳細資訊,請參閱相依性屬性概觀

時間軸和時鐘

動畫概 描述 a Timeline 如何代表時間區段,而動畫是產生輸出值的 型 Timeline 別。 本身,除了 Timeline 描述某個時間段之外,不會執行任何動作。 這是執行實際工作的時間軸 Clock 物件。 同樣地,動畫不會實際產生屬性的動畫效果:動畫類別描述應該如何計算輸出值,但它是 Clock 針對驅動動畫輸出並將它套用至屬性的動畫所建立的 。

Clock是一種特殊的 物件類型,可維護 的時間相關執行時間狀態 Timeline 。 它提供動畫和計時系統不可或缺的三個位資訊: CurrentTimeCurrentProgressCurrentState 。 使用 Clock 其所描述的計時行為來判斷其 Timeline 目前的時間、進度和狀態: DurationRepeatBehaviorAutoReverse 等等。

在大部分情況下, Clock 系統會自動為您的時間軸建立 。 當您使用 StoryboardBeginAnimation 方法建立動畫時,系統會自動為您的時間軸和動畫建立時鐘,並套用至其目標屬性。 您也可以使用 CreateClockTimeline 方法明確建立 Clock 。 方法 MediaTimeline.CreateClock 會為其呼叫的 建立 Timeline 適當型別的時鐘。 Timeline如果 包含子時間軸,它也會為其建立 Clock 物件。 產生的 Clock 物件會排列在樹狀結構中,以符合 Timeline 建立物件樹狀結構的物件樹狀結構。

不同類型的時間軸有不同類型的時鐘。 下表顯示 Clock 對應至某些不同 Timeline 類型的類型。

時間軸類型 時鐘類型 時鐘用途
動畫 (繼承自 AnimationTimeline AnimationClock 產生相依性屬性的輸出值。
MediaTimeline MediaClock 處理媒體檔案。
ParallelTimeline ClockGroup 群組及控制其子 Clock 物件
Storyboard ClockGroup 群組及控制其子 Clock 物件

您可以使用 方法,將您所建立的任何 AnimationClock 物件套用至相容的相依性屬性 ApplyAnimationClock

在效能密集的案例中,例如建立大量類似物件的動畫效果,管理您自己的 Clock 用途可以提供效能優勢。

時鐘和時間管理員

當您在 WPF 中建立物件動畫時,它是管理 Clock 為時間軸建立之物件的時間管理員。 時間管理員為 Clock 物件樹狀目錄的根目錄,並控制該樹狀目錄中的時間流程。 系統會自動為每個 WPF 應用程式建立時間管理員,而且對應用程式開發人員而言是看不見的。 時間管理員每一秒都會「滴答」許多次,每一秒發生的實際滴答數目會視可用的系統資源而有所不同。 在每一個刻度期間,時間管理員會計算計時樹狀結構中所有 ActiveClock 物件的狀態。

下圖顯示時間管理員和 之間的關聯性 AnimationClock ,以及動畫相依性屬性。

Timing system components and the time manager.
以動畫顯示屬性

當時間管理員刻度時,它會更新應用程式中的每個時間 ActiveClockClock如果 是 AnimationClock ,它會使用 GetCurrentValue 建立的 方法 AnimationTimeline 來計算其目前的輸出值。 AnimationClockAnimationTimeline 提供目前當地時間的 、輸入值,通常是 屬性的基底值,以及預設目的地值。 當您使用 GetValue 方法或其 CLR 存取子擷取由 屬性產生動畫的值時,您會取得其 AnimationClock 的輸出。

時鐘群組

上一節說明不同時間軸類型 Clock 的不同物件類型。 下圖顯示時間管理員、、 ClockGroupAnimationClock 和動畫相依性屬性之間的關聯性。 ClockGroup針對將其他時程表分組的時程表建立 ,例如 Storyboard 類別,其會將動畫和其他時程表分組。

Timing system components with the time manager and dependency properties.
ClockGroup

組合

您可以將多個時鐘與單一屬性進行關聯,此時每個時鐘都使用上述時鐘的輸出值做為其基底值。 下圖顯示套用至相同屬性的三 AnimationClock 個物件。 Clock1 使用動畫屬性的基底值做為輸入,並使用它來產生輸出。 Clock2 會採用從 Clock1 的輸出做為輸入,並使用它來產生輸出。 Clock3 會採用從 Clock2 的輸出做為輸入,並使用它來產生輸出。 當多個時鐘同時影響同一個屬性時,就可以說是形成一個組合鏈結。

Timing system components composed with multiple dependency properties.
組合鏈結

請注意,雖然在組合鏈結中物件的輸入和輸出 AnimationClock 之間建立關聯性,但其計時行為不會受到影響; Clock 物件(包括 AnimationClock 物件)對其父 Clock 物件具有階層式相依性。

若要將多個時鐘套用至相同的屬性,請在套用 、動畫或 AnimationClock 時使用 ComposeHandoffBehaviorStoryboard

滴答和事件彙總

除了計算輸出值,時間管理員也會在每次滴答時執行其他工作︰它會判斷每個時鐘的狀態並引發適當的事件。

雖然滴答經常發生,但有很多事可能會在滴答之間發生。 例如, Clock 可能會再次停止、啟動和停止,在此情況下,其 CurrentState 值會變更三次。 理論上, CurrentStateInvalidated 事件可以在單一刻度中多次引發;不過,計時引擎會合並事件,以便 CurrentStateInvalidated 每個刻度最多可以引發一次事件。 這適用于所有計時事件:每個型別的最多一個事件都會針對指定的 Clock 物件引發。

Clock當切換狀態,並在刻度之間返回其原始狀態時(例如,從 ActiveStopped 變更為 和回到 Active ),相關聯的事件仍會發生。

如需計時事件的詳細資訊,請參閱計時事件概觀

屬性的目前值和基底值

可動畫的屬性可以有兩個值︰基底值和目前值。 當您使用其 CLR 存取子或 SetValue 方法來設定屬性時,您可以設定其基底值。 當屬性未以動畫顯示時,其基底值和目前值都相同。

當您以動畫顯示內容時,會 AnimationClock 設定屬性的 目前 值。 透過其 CLR 存取子擷取屬性的值,或 方法會在 為 或 GetValueFillingAnimationClockActive 傳回 的 AnimationClock 輸出。 您可以使用 方法來擷取屬性的基底值 GetAnimationBaseValue

另請參閱