Compartilhar via


Visão geral de eventos de cronometragem

Este tópico descreve como usar os cinco eventos de tempo disponíveis nos objetos Timeline e Clock.

Pré-requisitos

Para entender este tópico, você deve entender como criar e usar animações. Para começar a usar a animação, consulte a Visão geral da animação.

Existem várias maneiras de animar propriedades no WPF:

Como você pode usá-los na marcação e no código, os exemplos nesta visão geral usam Storyboard objetos. No entanto, os conceitos descritos podem ser aplicados aos outros métodos de animação de propriedades.

O que é um relógio?

Uma linha do tempo, por si só, não faz nada além de descrever um segmento de tempo. É o objeto da linha do Clock tempo que realmente faz o trabalho: ele mantém o estado de execução relacionado ao tempo para a linha do tempo. Na maioria dos casos, como ao usar storyboards, um relógio é criado automaticamente para sua linha do tempo. Você também pode criar um Clock explicitamente usando o CreateClock método. Para obter mais informações sobre Clock objetos, consulte a visão geral do sistema de animação e temporização.

Por que usar eventos?

Com exceção de uma (busca alinhada ao último tique), todas as operações interativas de tempo são assíncronas. Não há como você saber exatamente quando eles serão executados. Isso pode ser um problema quando você tem outro código que depende da operação de temporização. Suponha que você queria parar uma linha do tempo que animava um retângulo. Depois que a linha do tempo for interrompida, você alterará a cor do retâ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

No exemplo anterior, a segunda linha de código pode ser executada antes que o storyboard pare. Isso porque parar é uma operação assíncrona. Dizer a uma linha do tempo ou relógio para parar cria uma espécie de "solicitação de parada" que não é processada até o próximo tique do motor de temporização.

Para executar comandos após a conclusão de uma linha do tempo, use eventos temporais. No exemplo a seguir, um manipulador de eventos é usado para alterar a cor de um retângulo depois que o storyboard para de reproduzir.

// 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 obter um exemplo mais completo, consulte Receber Notificação quando o estado de um relógio for alterado.

Eventos públicos

As classes Timeline e Clock fornecem ambos cinco eventos de temporização. A tabela a seguir lista esses eventos e as condições que os disparam.

Acontecimento Iniciando uma operação interativa Outros gatilhos
Concluído Ignorar para preencher O relógio se completa.
VelocidadeGlobalAtualInvalidada Pausar, retomar, buscar, definir taxa de velocidade, pular para preencher, parar O relógio inverte, acelera, inicia ou para.
EstadoAtualInvalidado Comece, pule para preencher, pare O relógio inicia, para ou completa.
HorárioAtualInvalidado Começar, buscar, pular para completar, parar O relógio progride.
SolicitaçãoDeRemoção Retirar

Rastreamento e Consolidação de Eventos

Quando você anima objetos no WPF, é o mecanismo de tempo que gerencia suas animações. O mecanismo de tempo controla a progressão do tempo e calcula o estado de cada animação. Realiza muitas dessas avaliações por segundo. Esses passes de avaliação são conhecidos como "tiques".

Embora os tiques ocorram com frequência, é possível que muitas coisas aconteçam entre tiques. Por exemplo, uma linha do tempo pode ser interrompida, iniciada e interrompida novamente, caso em que seu estado atual terá sido alterado três vezes. Em teoria, o evento pode ser gerado várias vezes em um único tick; no entanto, o motor de temporização consolida eventos, de modo que cada evento possa ser gerado no máximo uma vez por tick.

Registrando-se para eventos

Há duas maneiras de se registrar para eventos temporais: você pode se registrar através do cronograma ou utilizando o relógio criado a partir dele. Registrar-se para um evento diretamente com um relógio é bastante simples, embora ele só possa ser feito a partir do código. Você pode se inscrever em eventos com um cronograma de marcação ou código. A próxima seção descreve como inscrever-se em eventos de cronômetro em uma linha do tempo.

Registrando-se para eventos de relógio com um cronograma

Embora os eventos de uma linha do tempo Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidated e RemoveRequested pareçam estar associados à linha do tempo, o registro para esses eventos associa um manipulador de eventos ao Clock criado para ela.

Quando você se inscreve no Completed evento na linha do tempo, por exemplo, está realmente instruindo o sistema a inscrever-se no Completed evento de cada relógio que é criado para essa linha do tempo. No código, você deve se registrar para esse evento antes de Clock ser criado para essa linha do tempo; caso contrário, você não receberá uma notificação. Isso ocorre automaticamente no XAML; o analisador se registra automaticamente para o evento antes de Clock ser criado.

Consulte também