Información general sobre eventos de control de tiempo

En este tema se describe cómo usar los cinco eventos de control de tiempo disponibles en los objetos Timeline y Clock.

Requisitos previos

Para entender este tema, debe entender cómo crear y utilizar animaciones. Para empezar a trabajar con animaciones, consulte Información general sobre animaciones.

Hay varias maneras de animar propiedades en WPF:

Puesto que se pueden usar tanto en código como en marcado, los ejemplos de esta información general utilizan objetos Storyboard. Sin embargo, los conceptos descritos pueden aplicarse a los otros métodos existentes para animar propiedades.

¿Qué es un reloj?

Un objeto Timeline, por sí mismo, realmente no hace nada más que describir un segmento de tiempo. Es el objeto Clock de la escala de tiempo quien hace el trabajo real: mantiene los estados en tiempo de ejecución relacionados con el control de tiempo para el objeto Timeline. En la mayoría de los casos, como cuando se utilizan objetos Storyboard, se crea automáticamente un reloj para dichos objetos. También puede crear un elemento Clock explícitamente mediante el método CreateClock. Para obtener más información acerca de los objetos Clock, consulte Información general sobre sistemas de control de tiempo y animación.

¿Por qué usar eventos?

Con excepción de una operación, (operación de búsqueda alineada con el último ciclo), todas las operaciones de control de tiempo interactivas son asincrónicas. No hay ninguna manera de saber exactamente cuándo se ejecutarán. Esto puede ser un problema cuando hay otro código que depende de la operación de control de tiempo. Suponga que desea detener un objeto Timeline que anima un rectángulo. Una vez detenido el objeto Timeline, desea cambiar el color del rectángulo.

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

En el ejemplo anterior, la segunda línea de código podría ejecutarse antes de que se detenga el objeto Storyboard. Esto se debe a que la detención es una operación asincrónica. Al indicar a un objeto Timeline o Clock que se detenga, se crea una "solicitud de detención" que no se procesa hasta el siguiente ciclo del motor de control de tiempo.

Para ejecutar comandos una vez finalizada la reproducción de un objeto Timeline, utilice eventos de control de tiempo. En el ejemplo siguiente, se utiliza un controlador de eventos para cambiar el color de un rectángulo al detenerse el objeto Storyboard.

// 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

Para ver un ejemplo más completo, consulte Recibir una notificación cuando cambia el estado de un reloj.

Eventos públicos

Las clases Timeline y Clock proporcionan cinco eventos de control de tiempo. En la tabla siguiente se enumeran estos eventos y las condiciones que los desencadenan.

Evento Operación interactiva desencadenante Otros desencadenadores
Completado Omitir hasta completar El reloj se completa.
CurrentGlobalSpeedInvalidated Pausar, reanudar, buscar, establecer la relación de velocidad, omitir hasta completar, detener El reloj se invierte, acelera, inicia o detiene.
CurrentStateInvalidated Comenzar, omitir hasta completar, detener El reloj se inicia, detiene o completa.
CurrentTimeInvalidated Comenzar, buscar, omitir hasta completar, detener El reloj progresa.
RemoveRequested Quitar

Ciclos y consolidación de eventos

Al animar objetos en WPF, es el motor del control de tiempo quien administra las animaciones. El motor de control de tiempo realiza el seguimiento de la progresión del tiempo y calcula el estado de cada animación. Realiza muchas de estos pasos de evaluación en un segundo. Estos pasos de evaluación se denominan "ciclos".

Aunque los ciclos se producen con frecuencia, pueden ocurrir muchas cosas entre ellos. Por ejemplo, un objeto Timeline se podría detener, iniciar y detener de nuevo, en cuyo caso su estado actual habría cambiado tres veces. En teoría, el evento puede generarse varias veces en un único ciclo; sin embargo, el motor de control de tiempo consolida los eventos, para que cada evento se pueda generar como máximo una vez por ciclo.

Registro para eventos

Hay dos formas de registrarse para eventos de control de tiempo: con el objeto Timeline o con un objeto Clock creado a partir del objeto Timeline. Registrarse para un evento directamente con un reloj es bastante sencillo, aunque solo puede realizarse desde el código. Puede registrarse para eventos con un objeto Timeline tanto en marcado como en código. En la sección siguiente se describe cómo registrarse para eventos de reloj con un objeto Timeline.

Registrarse para eventos de reloj con un objeto Timeline

Si bien los eventos Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidated y RemoveRequested de una escala de tiempo parecen estar asociados a la escala de tiempo, el registro de estos eventos en realidad asocia un controlador de eventos con el elemento Clock creado para la escala de tiempo.

Al registrarse al evento Completed en una escala de tiempo, por ejemplo, en realidad está indicando al sistema que se registre al evento Completed de cada reloj que se ha creado para la escala de tiempo. En código, debe registrarse a este evento antes de la creación del objeto Clock para esta escala de tiempo; en caso contrario, no recibirá la notificación. Esto sucede automáticamente en XAML; el analizador se registra automáticamente al evento antes de la creación del objeto Clock.

Vea también