2009-05-27 62 views
2

動畫WPF中的MatrixTransform我有一個畫布,我需要動畫的RenderTransform屬性。開始和結束矩陣將是abiterrary,所以我不能預先在XAML中寫故事板,所以我試圖在代碼中做到這一點,我找不到如何做到這一點的任何示例,下面是我最好的嘗試這不起作用(它編譯和運行,但rendertransform不會改變)。從代碼

有關如何完成此任務的任何建議?

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

回答

2

今天早上我碰到這個問題,雖然我使用的解決方案將無法應付旋轉或剪切。 link

+0

這對我的問題至少有好處,至少是縮放和翻譯。 – Twelve47 2010-06-17 10:31:10

2

我設法matrixtransform通過設置rendersource和使用beginanimation

像這樣的工作:

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

不知道我究竟是如何打算做插值的所有關鍵幀我自己雖然:)