2009-05-27 2 views
2

У меня есть холст, который мне нужен, чтобы анимировать свойство RenderTransform. Начальная и конечная матрицы будут несовместимы, поэтому я не могу предварительно написать раскадровку в XAML, поэтому я пытаюсь сделать это в коде, я не могу найти никакого примера, как это сделать, ниже моя лучшая попытка который не работает (он компилируется и запускается, но rendertransform не изменяется).Анимация MatrixTransform в WPF с кодом

Любые предложения о том, как это сделать?

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

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

Не уверен, как именно я собираюсь сделать интерполяцию для всех ключевых кадров я сам :)

Смежные вопросы