Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este tópico descreve como e quando estender o sistema de animação do WPF, criando quadros-chave personalizados, classes de animação ou usando o retorno de chamada por quadro para contornar o sistema padrão.
Pré-requisitos
Para entender este tópico, você deve estar familiarizado com os diferentes tipos de animações fornecidos pelo WPF. Para obter mais informações, consulte a Visão Geral das Animações de/Para/Por, a Visão Geral das AnimaçõesKey-Frame e a Visão Geral das Animações de Caminho.
Como as classes de animação herdam da classe Freezable, você deve estar familiarizado com objetos Freezable e saber como herdar de Freezable. Para obter mais informações, consulte a Visão Geral dos Objetos Freezable.
Estendendo o sistema de animação
Há várias maneiras de estender o sistema de animação do WPF, dependendo do nível de funcionalidade interna que você deseja usar. Há três pontos de extensibilidade principais no mecanismo de animação do WPF:
Crie um objeto de quadro de chave personalizado herdando de uma das classes *<Type>*KeyFrame, como DoubleKeyFrame. Essa abordagem usa a maior parte da funcionalidade interna do mecanismo de animação do WPF.
Crie sua própria classe de animação herdando de AnimationTimeline ou de uma das classes *<Type>*AnimationBase.
Use o callback por quadro para gerar animações em uma base por quadro. Essa abordagem ignora completamente o sistema de animação e sincronização.
A tabela a seguir descreve alguns cenários para estender o sistema de animação.
| Quando você quiser... | Use essa abordagem |
|---|---|
| Personalize a interpolação entre os valores de um tipo que possui uma *<Type>*AnimationUsingKeyFrames correspondente. | Crie um quadro de chave personalizado. Para obter mais informações, consulte a seção Criar um Quadro de Chave Personalizado . |
| Personalize mais do que apenas a interpolação entre valores de um tipo que tenha uma animação *<Type>*correspondente. | Crie uma classe de animação personalizada que herda da classe *<Type>*AnimationBase que corresponde ao tipo que você deseja animar. Para obter mais informações, consulte a seção Criar uma classe de animação personalizada . |
| Animar um tipo que não tem animação WPF correspondente | Use uma ObjectAnimationUsingKeyFrames classe ou crie uma classe que herda de AnimationTimeline. Para obter mais informações, consulte a seção Criar uma classe de animação personalizada . |
| Animar vários objetos com valores que são computados em cada quadro e são baseados no último conjunto de interações de objeto | Utilize retorno de chamada por quadro. Para obter mais informações, consulte a seção Criar um Uso Per-Frame Retorno de Chamada . |
Criar um quadro de chave personalizado
Criar uma classe de quadro de chave personalizada é a maneira mais simples de estender o sistema de animação. Use essa abordagem quando desejar um método de interpolação diferente para uma animação de quadro-chave. Conforme descrito na visão geral doKey-Frame Animations, uma animação de quadro-chave usa objetos de quadro-chave para gerar seus valores de saída. Cada objeto de quadro-chave executa três funções:
Especifica um valor de destino usando sua Value propriedade.
Especifica o momento em que esse valor deve ser atingido usando sua KeyTime propriedade.
Interpola entre o valor do quadro de chave anterior e seu próprio valor implementando o método InterpolateValueCore.
Instruções de implementação
Derivar da classe abstrata *<Type>*KeyFrame e implementar o método InterpolateValueCore. O método InterpolateValueCore retorna o valor atual do quadro de chave. Ele usa dois parâmetros: o valor do quadro de chave anterior e um valor de progresso que varia de 0 a 1. Um progresso de 0 indica que o quadro-chave acabou de ser iniciado e um valor de 1 indica que o quadro-chave acabou de ser concluído e deve retornar o valor especificado por sua Value propriedade.
Como as classes *<Type>*KeyFrame herdam da classe Freezable, você também deve sobrescrever o método CreateInstanceCore para retornar uma nova instância da sua classe. Se a classe não usar propriedades de dependência para armazenar seus dados ou exigir inicialização extra após a criação, talvez seja necessário substituir métodos adicionais; consulte a visão geral de objetos do Freezable para obter mais informações.
Depois de criar sua animação *<Type>*KeyFrame personalizada, você pode usá-la com o *<Type>*AnimationUsingKeyFrames para esse tipo.
Criar uma classe de animação personalizada
Criar seu próprio tipo de animação oferece mais controle sobre como um objeto é animado. Há duas maneiras recomendadas de criar seu próprio tipo de animação: você pode derivar da AnimationTimeline classe ou da classe *<Type>*AnimationBase. Não se recomenda derivar das classes *<Type>*Animation ou *<Type>*AnimationUsingKeyFrames.
Derive de <Tipo>AnimationBase
Derivar de uma classe *<Type>*AnimationBase é a maneira mais simples de criar um novo tipo de animação. Use essa abordagem quando quiser criar uma nova animação para o tipo que já tenha uma classe *<Type>*AnimationBase correspondente.
Instruções de implementação
Derive de uma classe de animação do tipo *<Type>* e implemente o método GetCurrentValueCore. O método GetCurrentValueCore retorna o valor atual da animação. Ele usa três parâmetros: um valor inicial sugerido, um valor final sugerido e um AnimationClock, que você usa para determinar o progresso da animação.
Como as classes *<Type>*AnimationBase herdam da classe Freezable, você também deve sobrescrever o núcleo CreateInstanceCore para retornar uma nova instância da sua classe. Se a classe não usar propriedades de dependência para armazenar seus dados ou exigir inicialização extra após a criação, talvez seja necessário substituir métodos adicionais; consulte a visão geral de objetos do Freezable para obter mais informações.
Para obter mais informações, consulte a documentação do método GetCurrentValueCore para a classe *<Type>*AnimationBase para o tipo que você deseja animar. Para obter um exemplo, consulte o exemplo de animação personalizada
Abordagens alternativas
Se você simplesmente quiser alterar a forma como os valores de animação são interpolados, considere derivar de uma das classes *<Type>*KeyFrame. O quadro-chave criado pode ser usado com os *<Type>*AnimationUsingKeyFrames correspondentes fornecidos pelo WPF.
Derivar de AnimationTimeline
Deriva da AnimationTimeline classe quando você deseja criar uma animação para um tipo que ainda não tem uma animação WPF correspondente ou você deseja criar uma animação que não seja fortemente tipada.
Instruções de implementação
Derivar da AnimationTimeline classe e substituir os seguintes membros:
CreateInstanceCore – Se a nova classe for concreta, você deverá substituir CreateInstanceCore para retornar uma nova instância da classe.
GetCurrentValue – Sobrescreva este método para retornar o valor atual da sua animação. Ele usa três parâmetros: um valor de origem padrão, um valor de destino padrão e um AnimationClock. Use o AnimationClock para obter o tempo ou progresso atual da animação. Você pode escolher se deseja usar os valores de origem e destino padrão.
IsDestinationDefault – Sobrescreva esta propriedade para indicar se sua animação usa o valor de destino padrão especificado pelo método GetCurrentValue.
TargetPropertyType – Substitua essa propriedade para indicar a Type saída que sua animação produz.
Se a classe não usar propriedades de dependência para armazenar seus dados ou exigir inicialização extra após a criação, talvez seja necessário substituir métodos adicionais; consulte a visão geral de objetos do Freezable para obter mais informações.
O paradigma recomendado (usado por animações do WPF) é usar dois níveis de herança:
Crie uma classe abstrata *<Type>*AnimationBase que herda de AnimationTimeline. Essa classe deve substituir o TargetPropertyType método. Ele também deve introduzir um novo método abstrato, GetCurrentValueCore, e substituir GetCurrentValue para que ele valide os tipos do valor de origem padrão e os parâmetros de valor de destino padrão, em seguida, chama GetCurrentValueCore.
Crie outra classe que herda de sua nova classe *<Type>*AnimationBase e substitua o CreateInstanceCore método, o método GetCurrentValueCore que você introduziu e a IsDestinationDefault propriedade.
Abordagens alternativas
Se você quiser animar um tipo que não tenha animação De/Para/Por correspondente ou animação de quadro-chave, considere usar um ObjectAnimationUsingKeyFrames. Como ele é fracamente tipado, um ObjectAnimationUsingKeyFrames pode animar qualquer tipo de valor. A desvantagem dessa abordagem é que ObjectAnimationUsingKeyFrames só dá suporte à interpolação discreta.
Usar o retorno de chamada Per-Frame
Use essa abordagem quando precisar ignorar completamente o sistema de animação do WPF. Um cenário para essa abordagem são animações físicas, em que em cada etapa de animação uma nova direção ou posição de objetos animados precisa ser recomputada com base no último conjunto de interações de objeto.
Instruções de implementação
Ao contrário das outras abordagens descritas nesta visão geral, para usar o retorno de chamada por quadro, você não precisa criar uma animação personalizada ou uma classe de quadro chave.
Em vez disso, inscreva-se no evento Rendering do objeto que contém os objetos que você deseja animar. Esse método de manipulador de eventos é chamado uma vez por quadro. Sempre que o WPF transfere os dados de renderização persistidos da árvore visual para a árvore de composição, o método do seu manipulador de eventos é chamado.
No manipulador de eventos, execute os cálculos necessários para o efeito de animação e defina as propriedades dos objetos que você deseja animar com esses valores.
Para obter o tempo de apresentação do quadro atual, o EventArgs associado a esse evento pode ser convertido como RenderingEventArgs, que fornece uma RenderingTime propriedade que você pode usar para obter o tempo de renderização do quadro atual.
Para obter mais informações, consulte a Rendering página.
Consulte também
- AnimationTimeline
- IKeyFrame
- Visão geral das técnicas de animação da propriedade
- Visão Geral dos Objetos Congeláveis
- Visão geral das animações Key-Frame
- Visão geral das animações de caminho
- Visão geral da animação
- Visão geral do sistema de temporização e animação
- de exemplo de animação personalizada
.NET Desktop feedback