Compartir a través de


Cómo: Recibir una notificación cuando cambia el estado de un reloj

Actualización: noviembre 2007

Un evento CurrentStateInvalidated de reloj se produce cuando su propiedad CurrentState deja de ser válida, por ejemplo, cuando el reloj arranca o se para. Se puede efectuar el registro para este evento utilizando directamente un objeto Clock, o bien mediante un objeto Timeline.

En el ejemplo siguiente, se utiliza un objeto Storyboard y dos objetos DoubleAnimation para animar el ancho de dos rectángulos. El evento CurrentStateInvalidated se utiliza para realizar escuchas y detectar los cambios en el estado del reloj.

Ejemplo

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

En la ilustración siguiente se muestran los distintos estados que adoptan las animaciones a medida que progresa la escala de tiempo primaria (Storyboard).

Estados de reloj para guión gráfico con dos animaciones

En la tabla siguiente se muestra en qué momentos se activa el evento CurrentStateInvalidated de Animation1:

Tiempo (segundos)

1

10

19

21

30

39

Estado

Active

Active

Stopped

Active

Active

Stopped

En la tabla siguiente se muestra en qué momentos se activa el evento CurrentStateInvalidated de Animation2:

Tiempo (segundos)

1

9

11

19

21

29

31

39

Estado

Active

Filling

Active

Stopped

Active

Filling

Active

Stopped

Observe que el evento CurrentStateInvalidated de Animation1 se activa a los 10 segundos, aunque su estado sigue siendo Active. Esto se debe a que su estado cambia a los 10 segundos, pero de Active a Filling y, a continuación, vuelve a Active en el mismo paso.