Share via


タイミング イベントの概要

このトピックでは、Timeline オブジェクトと Clock オブジェクトで使用できる 5 つのタイミング イベントの使用方法について説明します。

必要条件

このトピックを理解するには、アニメーションの作成方法および使用方法を理解している必要があります。 アニメーションの概要については、「アニメーションの概要」を参照してください。

WPF では、複数の方法でプロパティをアニメーション化できます。

マークアップおよびコードで使用できるため、この概要の例では Storyboard オブジェクトを使用します。 ただし、その概念は、プロパティをアニメーション化する他の方法にも適用できます。

クロックとは

タイムライン自体は、時間のセグメントを記述する以外、実際には何も実行しません。 実際の処理を実行するのは、タイムラインの Clock オブジェクトです。このオブジェクトが、タイミングに関連するタイムラインの状態を維持します。 ストーリーボードを使用する場合など、ほとんどの場合は、タイムライン用のクロックが自動的に作成されます。 CreateClock メソッドを使用して、Clock を明示的に作成することもできます。 Clock オブジェクトの詳細については、「アニメーションとタイミング システムの概要」を参照してください。

イベントを使用する理由

1 つの例外 (最後のタイマー刻みへの配置のシーク) を除き、対話型タイミング操作はすべて非同期です。 これらが実行される正確な時期を知ることはできません。 そのため、タイミング操作に依存する他のコードが存在する場合、問題になることがあります。 四角形をアニメーション化したタイムラインを停止するとします。 タイムラインが停止したら、四角形の色を変更します。

            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;

前の例では、ストーリーボードが停止する前に、コードの 2 行目が実行される可能性があります。 停止が非同期の操作であるのは、このためです。 タイムラインまたはクロックに停止命令が伝えられると、"停止要求" が作成されます。これは、タイミング エンジンの次回のタイマー刻みまで処理されません。

タイムラインの完了後にコマンドを実行するには、タイミング イベントを使用します。 次の例では、イベント ハンドラーを使用して、ストーリーボードの再生が停止した後に四角形の色を変更しています。

            ' Register for the CurrentStateInvalidated timing event.
            AddHandler myStoryboard.CurrentStateInvalidated, AddressOf myStoryboard_CurrentStateInvalidated
// Register for the CurrentStateInvalidated timing event.
myStoryboard.CurrentStateInvalidated += new EventHandler(myStoryboard_CurrentStateInvalidated);

この例より完全なコード例については、「方法 : クロックの状態が変化したときに通知を受け取る」を参照してください。

パブリック イベント

Timeline および Clock クラスは、どちらも 5 つのタイミング イベントを提供します。 これらのイベントと、イベントがトリガーされる条件を次の表に示します。

イベント

対話型操作のトリガー

その他のトリガー

Completed

保留へスキップ

クロックが完了した。

CurrentGlobalSpeedInvalidated

一時停止、再開、シーク、速度比率の設定、保留へスキップ、停止

クロックが、反転、加速、開始、または停止した。

CurrentStateInvalidated

開始、保留へスキップ、停止

クロックが、開始、停止、または保留になった。

CurrentTimeInvalidated

開始、シーク、保留へスキップ、停止

クロックが進行した。

RemoveRequested

[削除]

タイマー刻みとイベントの統合

WPF でオブジェクトをアニメーション化する場合、アニメーションはタイミング エンジンが管理します。 タイミング エンジンは時間の進行を追跡し、各アニメーションの状態を計算します。 このような評価パスは、1 秒間に何度も行われます。 これらの評価パスは、"タイマー刻み" と呼ばれます。

タイマー刻みが頻繁に発生している間は、タイマー刻みの間隔に多くのことが行われる可能性があります。 たとえば、タイムラインが停止してから開始し、もう一度停止する可能性あります。この場合、タイムラインの状態は 3 回変更されています。 理論的には、イベントは 1 回のタイマー刻みで複数回発生することは可能ですが、タイミング エンジンはイベントを統合して、各イベントが 1 回のタイマー刻みにつき多くても 1 回だけ発生するようにします。

イベント用の登録

タイミング イベントを登録する方法は 2 つあります。タイムラインを使用する方法と、タイムラインから作成されたクロックを使用する方法です。 クロックを使用して直接登録する方法は非常に簡単ですが、コードからしか実行できません。 タイムラインを使用する場合は、マークアップまたはコードから実行できます。 次のセクションでは、タイムラインを使用してクロック イベントを登録する方法を説明します。

タイムラインを使用したクロック イベントの登録

タイムラインの CompletedCurrentGlobalSpeedInvalidatedCurrentStateInvalidatedCurrentTimeInvalidated、および RemoveRequested は、タイムラインに関連付けられているように見えますが、イベントを登録する場合、実際にはこのタイムラインのために作成された Clock にイベント ハンドラーを関連付けることになります。

たとえば、タイムラインの Completed イベントを登録する場合、実際にはタイムライン用に作成された各クロックの Completed イベントを登録するようにシステムに対して命令していることになります。 コードでは、タイムラインに対して Clock が作成される前にこのイベントを登録しないと、通知を受け取ることができません。 これは、XAML では自動的に処理され、Clock が作成される前に、パーサーが自動的にイベントの登録を行います。

参照

概念

アニメーションとタイミング システムの概要

アニメーションの概要

タイミング動作の概要