Partilhar via


Visão geral dos eventos de cronometragem

Este tópico descreve como usar os cinco eventos de temporização disponíveis em objetos Timeline e Clock.

Pré-requisitos

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

Existem várias formas de animar propriedades no WPF:

Como você pode usá-los em marcação e código, os exemplos nesta visão geral usam objetos Storyboard. 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 Clock da linha do tempo é que faz o trabalho real: ele mantém o estado relacionado à temporização 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 método CreateClock. Para obter mais informações sobre Clock objetos, consulte a Animation and Timing System Overview.

Porquê utilizar eventos?

Com exceção de um (procura alinhada ao último tick), todas as operações interativas de temporização são assíncronas. Não há como saber exatamente quando eles serão executados. Isso pode ser um problema quando você tem outro código que depende da sua 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 para, você altera 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 ao relógio para parar cria uma espécie de "pedido de paragem" que não é processado até ao próximo pulso do motor de temporização.

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

// 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 muda.

Eventos Públicos

As classes Timeline e Clock fornecem cinco eventos de cronometragem. A tabela a seguir lista esses eventos e as condições que os acionam.

Evento Ativando a operação interativa Outros fatores de desencadeamento
Concluído Saltar para o preenchimento O relógio conclui.
VelocidadeGlobalAtualInvalidada Pausar, retomar, procurar, definir relação de velocidade, saltar para preencher, parar O relógio inverte, acelera, inicia ou para.
EstadoAtualInvalidado Começar, saltar para preencher, parar O relógio começa, para ou enche.
TempoAtualInvalidado Começar, buscar, saltar para preenchimento, parar O relógio avança.
RemoçãoSolicitada Eliminar

Ticking e consolidação de eventos

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

Embora os carrapatos ocorram com frequência, é possível que muitas coisas aconteçam entre os carrapatos. 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 poderia ser levantado várias vezes em um único tick; No entanto, o mecanismo de cronometragem consolida os eventos, de modo que cada evento possa ser aumentado no máximo uma vez por tick.

Inscrição em Eventos

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

Registrando-se para eventos de relógio com uma linha do tempo

Embora os eventos Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidatede RemoveRequested de uma linha do tempo pareçam estar associados à linha do tempo, o registro desses eventos na verdade associa um manipulador de eventos ao Clock criado para a linha do tempo.

Quando te inscreves no evento Completed numa linha temporal, por exemplo, estás realmente a dizer ao sistema para se inscrever no evento Completed de cada relógio que é criado para a linha temporal. No código, você deve se registrar para este evento antes que o Clock seja criado para esta linha do tempo; caso contrário, você não receberá notificação. Isso acontece automaticamente em XAML; O analisador se registra automaticamente para o evento antes que o Clock seja criado.

Ver também

  • Visão geral do sistema de animação e cronometragem
  • Visão geral da animação
  • Visão geral dos comportamentos de cronometragem