Анимация MatrixTransform в WPF из кода - PullRequest
2 голосов
/ 27 мая 2009

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

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

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

Ответы [ 3 ]

5 голосов
/ 07 декабря 2010

Я реализовал класс MatrixAnimation, который поддерживает плавную анимацию перемещения, масштабирования и вращения. Он также поддерживает функции замедления! Найти на http://pwlodek.blogspot.com/2010/12/matrixanimation-for-wpf.html

2 голосов
/ 19 апреля 2010

Я столкнулся с этой проблемой сегодня утром, хотя решение, которое я использовал, не справится с поворотами или сдвигом. ссылка

2 голосов
/ 31 декабря 2009

Мне удалось заставить матрикс-трансформ работать, настроив источник визуализации и используя 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);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...