タイミング イベントの概要
このトピックでは、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 つがあります。 イベントをクロックに直接登録するのは非常に簡単ですが、コードからのみ行うことができます。 マークアップまたはコードからタイムラインにイベントを登録できます。 次のセクションでは、タイムラインでクロック イベントを登録する方法について説明します。
タイムラインを使用して時計イベントを登録する
タイムラインの Completed、CurrentGlobalSpeedInvalidated、CurrentStateInvalidated、CurrentTimeInvalidated、および RemoveRequested イベントはタイムラインに関連付けられているように見えますが、これらのイベントに登録すると、実際にはイベント ハンドラーがタイムライン用に作成された Clock に関連付けられます。
たとえば、タイムラインで Completed イベントに登録すると、タイムライン用に作成された各クロックの Completed イベントに登録するようにシステムに実際に指示します。 コードでは、このタイムラインに対して Clock を作成する前に、このイベントに登録する必要があります。それ以外の場合は、通知を受け取りません。 これは XAML で自動的に行われます。パーサーは、Clock が作成される前にイベントに自動的に登録します。
関連項目
.NET Desktop feedback