2009-05-27 6 views
2

Ich habe ein Canvas, das ich die RenderTransform-Eigenschaft von animieren müsste. Die Start- und Ende-Matrizen sind beliebig, daher kann ich das Storyboard nicht in XAML schreiben, also versuche ich es im Code zu tun, ich kann kein Beispiel dafür finden, unten ist mein bester Versuch was nicht funktioniert (es kompiliert und läuft, aber die Rendertransform ändert sich nicht).Animieren einer MatrixTransform in WPF aus Code

Irgendwelche Vorschläge, wie das gemacht werden sollte?

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(); 

Antwort

2

Ich stieß dieses Problem heute Morgen an, obwohl die Lösung, die ich verwendete, mit Rotationen oder Scheren nicht fertig wird. link

+0

Das ist großartig für mein Problem, das war, Skalierung und Übersetzung. – Twelve47

2

ich es geschafft Matrixtrans zum Laufen zu bringen, indem rendersource Einstellung und Beginanimation

so etwas wie dies mit:

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

nicht sicher, wie ich die Interpolation für alle Keyframes tun werde ich selbst obwohl :)

Verwandte Themen