Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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:
Uso de objetos de guion gráfico (marcado y código): puede usar Storyboard objetos para organizar y distribuir animaciones a uno o varios objetos. Para obtener un ejemplo, vea Animar una propiedad mediante un guión gráfico.
Usar animaciones locales (solo código): se pueden aplicar AnimationTimeline objetos directamente a las propiedades que animan. Para obtener un ejemplo, vea Animar una propiedad sin usar un guión gráfico.
Usando relojes (solo código): puede administrar explícitamente la creación del reloj y distribuir los relojes de animación usted mismo. Para obtener un ejemplo, vea Animar una propiedad mediante un AnimationClock.
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
.NET Desktop feedback