Información general sobre eventos de control de tiempo
Actualización: noviembre 2007
En este tema se describe cómo utilizar 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 obtener una introducción a las animaciones, consulte Información general sobre animaciones.
Hay varias maneras de animar propiedades en WPF:
Mediante objetos de guión gráfico (marcado y código): puede utilizar los objetos Storyboard para organizar y distribuir animaciones a uno o más objetos. Para obtener un ejemplo, consulte Cómo: Animar una propiedad utilizando un guión gráfico.
Mediante animaciones locales (sólo mediante código): puede aplicar directamente los objetos AnimationTimeline a las propiedades que animan. Para obtener un ejemplo, consulte Cómo: Animar una propiedad sin utilizar un guión gráfico.
Mediante relojes (sólo mediante código): puede administrar explícitamente la creación de relojes y distribuir los relojes de animación personalmente. Para obtener un ejemplo, consulte Cómo: Animar una propiedad usando un objeto AnimationClock.
En los ejemplos de esta información general se utilizan objetos Storyboard porque se pueden utilizar en el marcado y en el código. Sin embargo, los conceptos descritos se pueden aplicar a los demás métodos de animación de propiedades.
¿Qué es un reloj?
Una escala de tiempo, por sí misma, realmente no hace nada más que describir un segmento de tiempo. En realidad, es el objeto Clock de la escala de tiempo el que realiza el trabajo: en tiempo de ejecución, mantiene el estado de la escala de tiempo relacionado con el control de tiempo. En la mayoría de los casos, como cuando se utilizan guiones gráficos, se crea automáticamente un reloj para la escala de tiempo. También puede crear un objeto 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 temporización y animación.
¿Por qué se utilizan eventos?
Con la excepción de una (la búsqueda alineada con el último paso), 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 constituir un problema cuando hay otro código que depende de la operación de control de tiempo. Supongamos que desea detener una escala de tiempo que anima un rectángulo. Después de que la escala de tiempo se detiene, se cambia el color del rectángulo.
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 la detención es una operación asincrónica. Al indicar a una escala de tiempo o reloj que se detenga, se crea una especie de "solicitud de detención" que no se procesa hasta el siguiente paso del motor de control de tiempo.
Para ejecutar los comandos después de que se haya completado una escala de tiempo, se utilizan eventos de control de tiempo. En el ejemplo siguiente, se utiliza un controlador de eventos para cambiar el color de un rectángulo después de que se detenga la reproducción del guión gráfico.
// 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;
}
}
...
// Register for the CurrentStateInvalidated timing event.
myStoryboard.CurrentStateInvalidated += new EventHandler(myStoryboard_CurrentStateInvalidated);
Para obtener un ejemplo más completo, vea Cómo: 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 muestra una lista de estos eventos y de las condiciones que los activan.
Evento |
Operación interactiva desencadenante |
Otros desencadenadores |
---|---|---|
Completada |
Omitir hasta completar |
El reloj se completa. |
CurrentGlobalSpeedInvalidated |
Poner en pausa, reanudar, buscar, establecer porcentaje de velocidad, omitir hasta completar, detener |
El reloj se invierte, acelera, inicia o pone en pausa. |
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 |
Pasos y consolidación de eventos
Al animar objetos en WPF, el motor de control de tiempo se encarga de administrar las animaciones. El motor de control de tiempo realiza el seguimiento de la progresión de 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 "pasos."
Aunque los pasos se producen con frecuencia, pueden ocurrir muchas cosas entre ellos. Por ejemplo, una escala de tiempo 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 se podría provocar varias veces en un mismo paso; sin embargo, el motor de control de tiempo consolida los eventos, para que cada uno de ellos se pueda provocar, como máximo, una vez por paso.
Registrarse para eventos
Hay dos maneras de efectuar el registro para los eventos de control de tiempo: se puede realizar con la escala de tiempo o con el reloj creado a partir de ella. Registrarse directamente para un evento con un reloj es bastante sencillo, aunque sólo se puede hacer mediante código. Si utiliza una escala de tiempo, puede realizar el registro para los eventos mediante marcado o código. En la sección siguiente se describe cómo registrarse para los eventos de reloj con una escala de tiempo.
Registrarse para los eventos de reloj con una escala de tiempo
Aunque los eventos Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidated y RemoveRequested de una escala de tiempo parecen estar asociados a la escala de tiempo, al registrarse para estos eventos, en realidad, se asocia un controlador de eventos al Clock creado para ella.
Al registrarse para el evento Completed en una escala de tiempo, por ejemplo, en realidad está indicando al sistema que se registre para el evento Completed de cada reloj que se cree para la escala de tiempo. En el código, el registro para este evento se debe efectuar antes de que se cree el Clock para esta escala de tiempo; de lo contrario, no recibirá la notificación. Esto sucede automáticamente en XAML; el analizador efectúa automáticamente el registro para el evento antes de que se cree el Clock.
Vea también
Conceptos
Información general sobre sistemas de temporización y animación
Información general sobre animaciones
Información general sobre comportamientos de control de tiempo