我有一个Canvas,我需要为它的RenderTransform属性设置动画。开始和结束矩阵都是abitrary,所以我不能在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();
答案 0 :(得分:5)
我已经实现了MatrixAnimation类,它支持平滑的平移,缩放和旋转动画。它还支持缓动功能!查找http://pwlodek.blogspot.com/2010/12/matrixanimation-for-wpf.html
答案 1 :(得分:2)
我设法通过设置rendersource和使用beginanimation
来完成matrixtransform的工作类似的东西:
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);
我不确定自己将如何对所有关键帧进行插值:)
答案 2 :(得分:2)
我今天早上遇到了这个问题,虽然我使用的解决方案无法应对旋转或剪切。 link