Visão geral dos eventos de tempo
Este tópico descreve como usar os cinco eventos de tempo disponíveis em Timeline e Clock objetos.
Pré-requisitos
Para entender este tópico, você deve entender como criar e usar animações. Para se familiarizar com a animação, consulte Visão geral da animação.
Há várias maneiras de animar propriedades no WPF:
Usando objetos de storyboard (marcação e código): você pode usar Storyboard objetos para organizar e distribuir animações para um ou mais objetos. Para obter um exemplo, consulte Animar uma propriedade usando um storyboard.
Usando animações locais (somente código): você pode aplicar AnimationTimeline objetos diretamente às propriedades que eles animam. Para obter um exemplo, consulte Animar uma propriedade sem usar um storyboard.
Usando relógios (somente código): você pode gerenciar explicitamente a criação de relógios e distribuir os relógios de animação por conta própria. Para obter um exemplo, consulte Animar uma propriedade usando um AnimationClock.
Como você pode usá-los em marcação e 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 tempo que faz o trabalho real: ele mantém o estado de tempo de execução relacionado ao tempo para a linha do Clock tempo. Na maioria dos casos, como ao usar storyboards, um relógio é criado automaticamente para a 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 de tempo interativas são assíncronas. Não há nenhuma maneira de saber exatamente quando elas serão executadas. Isso pode ser um problema quando você tiver outro código que depende de sua operação de tempo. Suponha que você queira parar uma linha do tempo que anima um retângulo. Após a linha do tempo parar, 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 acontece porque a interrupção é uma operação assíncrona. Dizer a uma linha do tempo ou relógio para parar cria uma "solicitação de parada" que não é processada até o próximo tique do mecanismo de tempo.
Para executar comandos após a conclusão de uma linha do tempo, use eventos de tempo. No exemplo a seguir, um manipulador de eventos é usado para alterar a cor de um retângulo após o fim da reprodução do 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 um exemplo mais completo, consulte Como receber notificação quando o estado de um relógio mudar.
Eventos públicos
Clock As Timeline duas e turmas oferecem cinco eventos de cronometragem. A tabela a seguir lista esses eventos e as condições que os disparam.
Evento | Disparar a operação interativa | Outros gatilhos |
---|---|---|
Concluído | Ir diretamente para o preenchimento | O relógio é concluído. |
CurrentGlobalSpeedInvalidated | Pausar, retomar, procurar, definir taxa de velocidade, ir diretamente para o preenchimento, parar | O relógio reverte, acelera, inicia ou interrompe. |
CurrentStateInvalidated | Começar, ir diretamente para o preenchimento, parar | O relógio inicia, para ou preenche. |
CurrentTimeInvalidated | Começar, procurar, ir diretamente para o preenchimento, parar | O relógio prossegue. |
RemoveRequested | Remover |
Consolidação de eventos e tiques
Quando você anima objetos no WPF, é o mecanismo de temporização que gerencia suas animações. O mecanismo de tempo monitora o andamento do tempo e calcula o estado de cada animação. Ele realiza muitas etapas de avaliação desse tipo em um segundo. Essas etapas de avaliação são conhecidas como "tiques".
Enquanto tiques ocorrerem com frequência, é possível que muitas coisas ocorram entre tiques. Por exemplo, uma linha do tempo pode ser interrompida, iniciada e interrompida novamente e nesse caso seu estado atual terá sido alterado três vezes. Em teoria, o evento poderia ser gerado várias vezes em um único tique. No entanto, o mecanismo de tempo consolida eventos, de modo que cada evento pode ser gerado no máximo uma vez por tique.
Registrar-se em eventos
Há duas maneiras de se registrar em eventos de tempo: você pode se registrar na linha do tempo ou no relógio criado da linha do tempo. Registrar-se para um evento diretamente em um relógio é bastante simples, embora só possa ser feito no código. Você pode se registrar em eventos com uma linha do tempo de marcação ou código. A próxima seção descreve como se registrar em eventos de relógio com uma linha do tempo.
Registrando-se em eventos de relógio com uma linha do tempo
Embora os eventos , , , e de Completeduma linha do tempo pareçam estar associados à linha do tempo, CurrentGlobalSpeedInvalidatedCurrentTimeInvalidatedCurrentStateInvalidatedRemoveRequested o registro desses eventos na verdade associa um manipulador de eventos ao Clock criado para a linha do tempo.
Quando você se registra para o evento em uma linha do tempo, por exemplo, você está realmente dizendo ao sistema para se registrar para o CompletedCompleted evento de cada relógio que é criado para a linha do tempo. 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.
Confira também
.NET Desktop feedback