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();
Foi útil?

Solução

topei com este problema, esta manhã, embora a solução que eu usei não vai lidar com rotações ou corte.

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:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top