Gewusst wie: Empfangen von Benachrichtigungen bei Statusänderungen der Uhr

Aktualisiert: November 2007

Das CurrentStateInvalidated-Ereignis einer Uhr tritt auf, wenn ihr CurrentState ungültig wird, beispielsweise, wenn die Uhr angehalten oder gestartet wird. Sie können dieses Ereignis registrieren, indem Sie entweder direkt eine Clock verwenden, oder indem Sie die Registrierung mit einer Timeline vornehmen.

Im folgenden Beispiel werden ein Storyboard-Objekt und zwei DoubleAnimation-Objekte verwendet, um die Breite von zwei Rechtecken zu animieren. Das CurrentStateInvalidated-Ereignis wird verwendet, um Statusänderungen der Uhr zu überwachen.

Beispiel

<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() + " ";                 
        }
    }
}

Die folgende Abbildung zeigt die unterschiedlichen Zustände an, in die die Animationen übergehen, während die übergeordnete Zeitachse (Storyboard) fortschreitet.

Uhr-Zustände für ein Drehbuch mit zwei Animationen

In der folgenden Tabelle sind die Zeiten aufgeführt, zu denen das CurrentStateInvalidated-Ereignis von Animation1 ausgelöst wird:

Zeit (Sekunden)

1

10

19

21

30

39

Status

Aktiv

Aktiv

Beendet

Aktiv

Aktiv

Beendet

In der folgenden Tabelle sind die Zeiten aufgeführt, zu denen das CurrentStateInvalidated-Ereignis von Animation2 ausgelöst wird:

Zeit (Sekunden)

1

9

11

19

21

29

31

39

Status

Aktiv

Füllung

Aktiv

Beendet

Aktiv

Füllung

Aktiv

Beendet

Beachten Sie, dass das CurrentStateInvalidated-Ereignis von Animation1 bei 10 Sekunden ausgelöst wird, obwohl der Status weiterhin Active ist. Dies kommt daher, dass sich der Status bei 10 Sekunden geändert hat, wobei er sich jedoch von Active in Filling und am selben Teilstrich wieder in Active geändert hat.