タイミング イベントの概要
更新 : 2007 年 11 月
このトピックでは、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;
前の例では、ストーリーボードが停止する前に、コードの 2 行目が実行される可能性があります。停止が非同期の操作であるのは、このためです。タイムラインまたはクロックに停止命令が伝えられると、"停止要求" が作成されます。これは、タイミング エンジンの次回のタイマ刻みまで処理されません。
タイムラインの完了後にコマンドを実行するには、タイミング イベントを使用します。次の例では、イベント ハンドラを使用して、ストーリーボードの再生が停止した後に四角形の色を変更しています。
// 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;
}
}
...
// Register for the CurrentStateInvalidated timing event.
myStoryboard.CurrentStateInvalidated += new EventHandler(myStoryboard_CurrentStateInvalidated);
より完全なコード例については、「方法 : クロックの状態が変化したときに通知を受け取る」を参照してください。
パブリック イベント
Timeline および Clock クラスは、どちらも 5 つのタイミング イベントを提供します。これらのイベントと、イベントがトリガされる条件を次の表に示します。
イベント |
対話型操作のトリガ |
その他のトリガ |
---|---|---|
[完了] |
保留へスキップ |
クロックが完了した。 |
CurrentGlobalSpeedInvalidated |
一時停止、再開、シーク、速度比率の設定、保留へスキップ、停止 |
クロックが、反転、加速、開始、または停止した。 |
CurrentStateInvalidated |
開始、保留へスキップ、停止 |
クロックが、開始、停止、または保留になった。 |
CurrentTimeInvalidated |
開始、シーク、保留へスキップ、停止 |
クロックが進行した。 |
RemoveRequested |
削除 |
タイマ刻みとイベントの統合
WPF でオブジェクトをアニメーション化する場合、アニメーションはタイミング エンジンが管理します。タイミング エンジンは時間の進行を追跡し、各アニメーションの状態を計算します。このような評価パスは、1 秒間に何度も行われます。これらの評価パスは、"タイマ刻み" と呼ばれます。
タイマ刻みが頻繁に発生している間は、タイマ刻みの間隔に多くのことが行われる可能性があります。たとえば、タイムラインが停止してから開始し、もう一度停止する可能性あります。この場合、タイムラインの状態は 3 回変更されています。理論的には、イベントは 1 回のタイマ刻みで複数回発生することは可能ですが、タイミング エンジンはイベントを統合して、各イベントが 1 回のタイマ刻みにつき多くても 1 回だけ発生するようにします。
イベント用の登録
タイミング イベントを登録する方法は 2 つあります。タイムラインを使用する方法と、タイムラインから作成されたクロックを使用する方法です。クロックを使用して直接登録する方法は非常に簡単ですが、コードからしか実行できません。タイムラインを使用する場合は、マークアップまたはコードから実行できます。次のセクションでは、タイムラインを使用してクロック イベントを登録する方法を説明します。
タイムラインを使用したクロック イベントの登録
タイムラインの Completed、CurrentGlobalSpeedInvalidated、CurrentStateInvalidated、CurrentTimeInvalidated、および RemoveRequested は、タイムラインに関連付けられているように見えますが、イベントを登録する場合、実際にはこのタイムラインのために作成された Clock にイベント ハンドラを関連付けることになります。
たとえば、タイムラインの Completed イベントを登録する場合、実際にはタイムライン用に作成された各クロックの Completed イベントを登録するようにシステムに対して命令していることになります。コードでは、タイムラインに対して Clock が作成される前にこのイベントを登録しないと、通知を受け取ることができません。これは、XAML では自動的に処理され、Clock が作成される前に、パーサーが自動的にイベントの登録を行います。