Compartir a través de


Información general sobre eventos de control de tiempo

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

Prerrequisitos

Para comprender este tema, debe comprender cómo crear y usar animaciones. Para empezar a trabajar con la animación, consulte Información general sobre la animación.

Hay varias maneras de animar propiedades en WPF:

Dado que puede usarlos en el marcado y el código, los ejemplos de este resumen usan objetos Storyboard. Sin embargo, los conceptos descritos se pueden aplicar a los otros métodos de animación de propiedades.

¿Qué es un reloj?

Una escala de tiempo, por sí misma, no hace nada más que describir un segmento de tiempo. Es el objeto de la línea de Clock tiempo que hace el trabajo real: mantiene el estado de ejecución relacionado con el tiempo para la línea de tiempo. En la mayoría de los casos, como cuando se usan guiones gráficos, un reloj para la línea de tiempo se crea automáticamente. También puede crear un elemento Clock explícitamente mediante el CreateClock método . Para obtener más información sobre los objetos, vea Información general sobre Clock el sistema de control de tiempo y animación.

¿Por qué usar eventos?

Con la excepción de una (búsqueda alineada con la última marca), todas las operaciones de temporización interactivas son asincrónicas. No hay forma de saber exactamente cuándo se ejecutarán. Esto puede ser un problema cuando tiene otro código que depende de la operación de sincronización. Supongamos que quisieras detener una línea de tiempo que animara un rectángulo. Después de que la línea de tiempo se detenga, cambie 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 guión gráfico. Esto se debe a que detener es una operación asincrónica. Indicar a una línea de tiempo o un reloj que se detenga crea una especie de "solicitud de detención" que no se procesa hasta el próximo tic del motor de temporización.

Para ejecutar comandos una vez completado un cronograma, use eventos temporales. En el ejemplo siguiente, se usa un controlador de eventos para cambiar el color de un rectángulo después de que el guión gráfico deje de reproducirse.

// 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 obtener un ejemplo más completo, vea Recibir notificación cuando cambia el estado de un reloj.

Eventos públicos

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

Evento Desencadenamiento de una operación interactiva Otros desencadenadores
completado Omitir para rellenar El reloj termina.
VelocidadGlobalActualInvalidada Pausar, reanudar, buscar, establecer relación de velocidad, saltar al siguiente contenido, parar El reloj invierte, acelera, inicia o detiene.
CurrentStateInvalidated Iniciar, omitir para completar, detener El reloj se inicia, detiene o rellena.
HoraActualInvalidada Iniciar, buscar, omitir para completar, detener El reloj avanza.
RemoveRequested Eliminar

Tics y consolidación de eventos

Cuando animas objetos en WPF, es el motor de tiempo el que administra tus animaciones. El motor de control de tiempo realiza un seguimiento de la progresión del tiempo y calcula el estado de cada animación. Realiza muchas evaluaciones de este tipo en un segundo. Estos pasos de evaluación se conocen como "tics".

Aunque los ticks se producen con frecuencia, es posible que ocurran muchas cosas entre ticks. Por ejemplo, una escala de tiempo se puede detener, iniciar y detener de nuevo, en cuyo caso su estado actual cambiará tres veces. En teoría, el evento podría generarse varias veces en un solo tic; sin embargo, el motor de control de tiempo consolida los eventos, de modo que cada evento se pueda generar como máximo una vez por tic.

Registro para eventos

Hay dos maneras de registrarse para los eventos temporales: puede registrarse en la línea de tiempo o con el reloj creado a partir de la línea de tiempo. El registro de un evento directamente con un reloj es bastante sencillo, aunque solo se puede hacer desde el código. Puede registrarse para eventos con un cronograma a partir del marcado o el código. En la sección siguiente se describe cómo registrarse para eventos de reloj con una escala de tiempo.

Registro para eventos del reloj con un cronograma

Aunque 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 realmente asocia un controlador de eventos con el Clock creado para la escala de tiempo.

Cuando se registra para el Completed evento en una escala de tiempo, por ejemplo, le indica al sistema que se registre para el Completed evento de cada reloj que se crea para la escala de tiempo. En el código, debe registrarse para este evento antes de que se cree el Clock para esta línea de tiempo; de lo contrario, no recibirá notificación. Esto sucede automáticamente en XAML; el analizador se registra automáticamente para el evento antes de que se cree Clock.

Consulte también