方法 : クロックの状態が変化したときに通知を受け取る

更新 : 2007 年 11 月

クロックの CurrentStateInvalidated イベントは、クロックの CurrentState が無効化されたとき (クロックが開始または停止されたときなど) に発生します。このイベントは、Clock を直接使用するか、または Timeline を使用して登録できます。

次の例では、 2 つの四角形の幅をアニメーション化するために、Storyboard と 2 つの DoubleAnimation オブジェクトを使用しています。CurrentStateInvalidated イベントは、クロック状態の変化を待機するために使われています。

使用例

<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" 
  x:Class="Microsoft.Samples.Animation.TimingBehaviors.StateExample"
  Background="LightGray">
  <StackPanel Margin="20">

    <TextBlock 
      Name="ParentTimelineStateTextBlock"></TextBlock>
    <TextBlock 
      Name="Animation1StateTextBlock"></TextBlock>
    <Rectangle 
      Name="Rectangle01"
      Width="100" Height="50" Fill="Orange" />    
    <TextBlock Name="Animation2StateTextBlock"></TextBlock>
    <Rectangle 
      Name="Rectangle02"
      Width="100" Height="50" Fill="Gray" />  

    <Button Content="Start Animations" Margin="20">
      <Button.Triggers>
        <EventTrigger RoutedEvent="Button.Click">
          <BeginStoryboard>
            <Storyboard RepeatBehavior="2x" AutoReverse="True"
              CurrentStateInvalidated="parentTimelineStateInvalidated" >
              <DoubleAnimation
                Storyboard.TargetName="Rectangle01"
                Storyboard.TargetProperty="Width"
                From="10" To="200" Duration="0:0:9"
                BeginTime="0:0:1" 
                CurrentStateInvalidated="animation1StateInvalidated"/>
              <DoubleAnimation
                Storyboard.TargetName="Rectangle02"
                Storyboard.TargetProperty="Width"
                From="10" To="200" Duration="0:0:8"
                BeginTime="0:0:1" 
                CurrentStateInvalidated="animation2StateInvalidated" />            
            </Storyboard>
          </BeginStoryboard>
        </EventTrigger>
      </Button.Triggers>
    </Button>


  </StackPanel>
</Page>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;

namespace Microsoft.Samples.Animation.TimingBehaviors
{

    public partial class StateExample : Page
    {        

        private void parentTimelineStateInvalidated(object sender, EventArgs args)
        {
            Clock myClock = (Clock)sender;
            ParentTimelineStateTextBlock.Text += 
                myClock.CurrentTime.ToString() + ":" 
                + myClock.CurrentState.ToString() + " ";        
        }

        private void animation1StateInvalidated(object sender, EventArgs args)
        {

            Clock myClock = (Clock)sender;

            Animation1StateTextBlock.Text += 
                myClock.Parent.CurrentTime.ToString() + ":" 
                + myClock.CurrentState.ToString() + " ";     
        }

        private void animation2StateInvalidated(object sender, EventArgs args)
        {

            Clock myClock = (Clock)sender;
            Animation2StateTextBlock.Text += 
                myClock.Parent.CurrentTime.ToString() + ":" 
                + myClock.CurrentState.ToString() + " ";                 
        }
    }
}

次の図は、親タイムライン (Storyboard) の進行に応じて、アニメーションがさまざまな状態に変化することを示したものです。

クロックは 2 つのアニメーションを含むストーリーボードを示します

次の表は、Animation1 の CurrentStateInvalidated イベントが発生する時間を示したものです。

時間 (秒)

1

10

19

21

30

39

状態

[アクティブ]

[アクティブ]

[停止]

[アクティブ]

[アクティブ]

[停止]

次の表は、Animation2 の CurrentStateInvalidated イベントが発生する時間を示したものです。

時間 (秒)

1

9

11

19

21

29

31

39

状態

[アクティブ]

Filling

[アクティブ]

[停止]

[アクティブ]

Filling

[アクティブ]

[停止]

Animation1 の CurrentStateInvalidated イベントは10秒で発生しますが、状態は Active のままになる点に注目してください。これは、状態は 10 秒で変更されますが、Active から Filling に変更され、同じタイミングで再び Active に戻されるためです。