WPF TranslateTransform из вращающегося объекта в холсте в фиксированный объект в другом холсте - PullRequest
1 голос
/ 15 ноября 2011

У меня есть три холста, которые я использую в приложении для карточных игр, которое я создаю.Одним из них является основной холст, в котором два других являются дочерними холстами (один статический, а другой вращается):

Canvas Layout

В этом примере приложения я хочу переместить RotatingEl впозиция на StaticEl:

Start Point

Когда я нажимаю кнопку «Переместить», она работает как положено:

End Point

Теперь,Я хочу повернуть RotatingCanvas и по-прежнему перемещать RotatingEl в положение StaticEl И настроить вращение так, чтобы оно соответствовало углу StaticEl:

Rotated Canvas

Когда я пытаюсь его переместитьнеправильное местоположение:

End Location After Move

Вот мой код при нажатии кнопки перемещения:

GeneralTransform generalTransformStaticEl = StaticEl.TransformToVisual(MainCanvas);
        Point pointstatic = generalTransformStaticEl.Transform(new Point()); 
        GeneralTransform generalTransformRotEl = RotatingEl.TransformToVisual(MainCanvas);
        Point pointrot = generalTransformRotEl.Transform(new Point());

        double distancecalcX = pointstatic.X - pointrot.X;
        double distancecalcY = pointstatic.Y - pointrot.Y;

        DoubleAnimation ELMoveY = new DoubleAnimation();

        ELMoveY.From = Canvas.GetTop(RotatingEl);
        ELMoveY.To = Canvas.GetTop(RotatingEl)+(distancecalcY);
        ELMoveY.Duration = new Duration(TimeSpan.FromSeconds(1.0));

        DoubleAnimation ELMoveX = new DoubleAnimation();

        ELMoveX.From = Canvas.GetLeft(RotatingEl);
        ELMoveX.To = Canvas.GetLeft(RotatingEl)+(distancecalcX);
        ELMoveX.Duration = new Duration(TimeSpan.FromSeconds(1.0));

        RotatingEl.BeginAnimation(Canvas.LeftProperty, ELMoveX);
        RotatingEl.BeginAnimation(Canvas.TopProperty, ELMoveY);

Как настроить анимацию «До» для неподвижного изображения?переместить вращающийся холст RotatingEl в положение статического StaticEl и отрегулировать вращение RotatingEl в соответствии с ориентацией StaticEl?

1 Ответ

1 голос
/ 16 ноября 2011

Я нашел свое собственное решение. Если кому-то может быть интересно, вот обновленный код:

double foundangle = 0;
        //verify an actual transform group is there before getting rotate angle
        if (RotatingCanvas.RenderTransform.Value.ToString() != "Identity")
        {
            RotateTransform rt = (RotatingCanvas.RenderTransform as TransformGroup).Children[2] as RotateTransform;
            foundangle = rt.Angle;
        }
        RotateTransform rottrans = new RotateTransform(foundangle*-1);
        RotatingEl.RenderTransform = rottrans;
        GeneralTransform generalTransformStaticEl = StaticEl.TransformToVisual(RotatingCanvas);
        Point pointstatic = generalTransformStaticEl.Transform(new Point());

        DoubleAnimation ELMoveY = new DoubleAnimation();

        ELMoveY.From = Canvas.GetTop(RotatingEl);
        ELMoveY.To = pointstatic.Y;
        ELMoveY.Duration = new Duration(TimeSpan.FromSeconds(1.0));

        DoubleAnimation ELMoveX = new DoubleAnimation();

        ELMoveX.From = Canvas.GetLeft(RotatingEl);
        ELMoveX.To = pointstatic.X;
        ELMoveX.Duration = new Duration(TimeSpan.FromSeconds(1.0));

        RotatingEl.BeginAnimation(Canvas.LeftProperty, ELMoveX);
        RotatingEl.BeginAnimation(Canvas.TopProperty, ELMoveY);

GeneralTransformStaticEl требовал координат из повернутого холста вместо не повернутого MainCanvas. Корректировка вращения была просто вопросом получения текущего угла поворота Rotated canvas и умножения на -1 для выравнивания со статическим прямоугольником

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