Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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:
Usando objetos de storyboard (marcação e código): é possível usar objetos Storyboard para organizar e distribuir animações por um ou mais objetos. Para obter um exemplo, consulte Animar uma propriedade usando um storyboard.
Usando animações locais (apenas código): pode aplicar diretamente objetos AnimationTimeline às propriedades que estes animam. Para obter um exemplo, consulte: Animar uma propriedade sem usar um Storyboard.
Usando relógios (somente código): Você pode gerenciar de forma explícita a criação de relógios e distribuir os relógios de animação você mesmo. Para obter um exemplo, consulte Animar uma propriedade com um relógio de animação.
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
.NET Desktop feedback