次の方法で共有


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

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

前提 条件

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

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

  • ストーリーボード オブジェクト (マークアップとコード) を使用する: Storyboard オブジェクトを使用して、アニメーションを 1 つ以上のオブジェクトに配置および配布できます。 例については、「ストーリーボード使用してプロパティをアニメーション化する」を参照してください。

  • ローカル アニメーション を使用する (コードのみ): アニメーション化 AnimationTimeline プロパティに直接オブジェクトを適用できます。 例については、「ストーリーボードを使用せずにプロパティをアニメーション化する を参照してください。

  • クロック を使用する (コードのみ): クロックの作成を明示的に管理し、アニメーション クロックを自分で配布できます。 例については、「AnimationClockを使用してプロパティをアニメーション化する」を参照してください。

マークアップとコードで使用できるため、この概要の例では 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.
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 クラスの両方で、5 つのタイミング イベントが提供されます。 次の表に、これらのイベントと、それらをトリガーする条件を示します。

出来事 対話型操作のトリガー その他のトリガー
Completed 塗りつぶしまでスキップ クロックが完了する。
CurrentGlobalSpeedInvalidated 一時停止、再開、シーク、速度比を設定、塗りつぶしまでスキップ、停止 クロックは反転、加速、開始、または停止します。
CurrentStateInvalidated 開始、塗りつぶしまでスキップ、停止 クロックが開始、停止、または塗りつぶされる。
現在時刻が無効になっています 開始、シーク、塗りつぶしまでスキップ、停止 時計が進む。
RemoveRequested 削除

ティッキングとイベントの統合

WPF でオブジェクトをアニメーション化する場合、アニメーションを管理するのはタイミング エンジンです。 タイミング エンジンは時間の進行を追跡し、各アニメーションの状態を計算します。 これにより、このような評価パスが 1 秒で多数作成されます。 これらの評価パスは "ティック" と呼ばれます。

ティックは頻繁に発生しますが、各ティックの間には多くのことが起こる可能性があります。 たとえば、タイムラインが停止、開始、停止された場合、現在の状態は 3 回変更されます。 理論的には、イベントは1ティックで複数回発生する可能性があります。ただし、タイミング エンジンはイベントを統合するため、各イベントはティックごとに最大で 1 回発生できます。

イベントへの登録

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

タイムラインを使用して時計イベントを登録する

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

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

関連項目