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:
Usar objetos Storyboard (marcado y código): puede usar objetos Storyboard para organizar y distribuir animaciones a uno o varios objetos. Para obtener un ejemplo, consulte Animar una propiedad utilizando un guión gráfico.
Mediante animaciones locales (solo código): puede aplicar objetos AnimationTimeline directamente a las propiedades que animan. Para obtener un ejemplo, vea Animar una propiedad sin utilizar un guión gráfico.
Mediante relojes (solo código): puede administrar la creación de un reloj explícitamente y distribuir los relojes de animación personalmente. Para obtener un ejemplo, consulte Animar una propiedad usando un objeto AnimationClock.
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
.NET Desktop feedback