Animando um MatrixTransform no WPF a partir do código
Pergunta
Eu tenho uma tela que eu precisa para animar a propriedade RenderTransform de. As matrizes de início e fim será abitrary, então não posso pré escrever o storyboard em XAML, então eu estou tentando fazê-lo no código, eu não consigo encontrar nenhum exemplo de como fazer isso, abaixo é a minha melhor tentativa que não funciona (que compila e executa, mas o RenderTransform não muda).
Todas as sugestões sobre como isso deve ser feito?
MatrixAnimationUsingKeyFrames anim = new MatrixAnimationUsingKeyFrames();
MatrixKeyFrameCollection keyframes = new MatrixKeyFrameCollection();
DiscreteMatrixKeyFrame start = new DiscreteMatrixKeyFrame(fromMatrix, KeyTime.FromPercent(0));
DiscreteMatrixKeyFrame end = new DiscreteMatrixKeyFrame(toMatrix, KeyTime.FromPercent(1));
keyframes.Add(start);
keyframes.Add(end);
anim.KeyFrames = keyframes;
Storyboard.SetTarget(anim, World.RenderTransform);
Storyboard.SetTargetProperty(anim, new PropertyPath("Matrix"));
Storyboard sb = new Storyboard();
sb.Children.Add(anim);
sb.Duration = TimeSpan.FromSeconds(4);
sb.Begin();
Outras dicas
Eu tenho implementado classe MatrixAnimation que suporta tradução suave, escala e rotação animações. Ele também suporta funções de atenuação! Procurar em http://pwlodek.blogspot.com/2010/12/matrixanimation-for-wpf. html
Eu consegui MatrixTransform trabalho, definindo rendersource e usando BeginAnimation
algo como isto:
this.matrixTransform = new MatrixTransform();
this.canvas.RenderTransform = this.matrixTransform;
MatrixAnimationUsingKeyFrames anim = new MatrixAnimationUsingKeyFrames();
anim.KeyFrames = new MatrixKeyFrameCollection();
anim.Duration = TimeSpan.FromSeconds(4);
Matrix fromMatrix = new Matrix(2, 0, 0, 2, 0, 0);
Matrix toMatrix = new Matrix(3, 0, 0, 3, 0, 0);
anim.FillBehavior = FillBehavior.HoldEnd;
DiscreteMatrixKeyFrame start = new DiscreteMatrixKeyFrame(fromMatrix, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0)));
DiscreteMatrixKeyFrame end = new DiscreteMatrixKeyFrame(toMatrix, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(4)));
anim.KeyFrames.Add(start);
anim.KeyFrames.Add(end);
this.matrixTransform.BeginAnimation(MatrixTransform.MatrixProperty, anim);
Não tenho certeza exatamente como eu vou fazer a interpolação para todos os keyframes me embora:)