none
WPF程序,一个矩形怎么根据拖动其左上角来实现其按其中心点旋转? RRS feed

  • 问题

  • 其实,是这样的,一组被选择的stroke,其选择框上左上角加了一个旋转按钮,现在需要根据拖动这个旋转按钮来实现被选择的stroke根据拖动的角度和方向(要判断顺时针还是逆时针)旋转。怎么实现??

    简单而言,就是有一个矩形,左上角有一个按钮,拖动这个按钮来使得这个矩形根据拖动的方向及角度来实现按其中心点的旋转??

    求解!

    2014年10月30日 6:31

答案

全部回复

  • 你好,

    当Rectangle有MouseDown,MouseUp,MouseMove的事件,你可以在这些事件里检测到鼠标位置,根据当前鼠标点、初始的鼠标点和你的已知的中心点的位置我们就可以计算他们之间的角度:

    计算方法可以参照这里:

    http://bbs.csdn.net/topics/330018316

    public static float Angle(Point cen, Point first, Point second)
            {
                float dx1, dx2, dy1, dy2;
                float angle;
     
                dx1 = first.X - cen.X;
                dy1 = first.Y - cen.Y;
     
                dx2 = second.X - cen.X;
     
                dy2 = second.Y - cen.Y;
     
                float c = (float)Math.Sqrt(dx1 * dx1 + dy1 * dy1) * (float)Math.Sqrt(dx2 * dx2 + dy2 * dy2);
     
                if (c == 0) return -1;
     
                angle = (float)Math.Acos((dx1 * dx2 + dy1 * dy2) / c);
     
                return angle;
            }

    而在WPF中我们支持RotateClass http://msdn.microsoft.com/en-us/library/system.windows.media.rotatetransform(v=vs.110).aspx

    你可以看到如下代码:

    // Create a RotateTransform to rotate 
    // the Polyline 45 degrees about the 
    // point (25,50).
    RotateTransform rotateTransform2 =
        new RotateTransform(45);
    rotateTransform2.CenterX = 25;
    rotateTransform2.CenterY = 50;
    polyline2.RenderTransform = rotateTransform2;

    既然我们有中心点和角度,那么在Up事件里面我们就可以写出这个rectangle的RenderTransform来做成这个旋转。

    (这里的点都是针对的客户区的。)




    Barry
    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.



    2014年10月31日 9:31
    版主
  • 这个方法我也试过,是在触摸事件ManipulationStarting,ManipulationDelta,ManipulationCompleted中实现,可是计算角度不知道顺时针,逆时针啊?
    2014年11月3日 9:31
  • 可以使用Vector.AngleBetween方法来获得角度差值, 具体见:

    http://msdn.microsoft.com/zh-cn/library/system.windows.vector.anglebetween(v=vs.110).aspx

    只需要根据当前鼠标点及初始鼠标点来计算出对应向量, 即可通过上述方法来获得夹角, 然后通过Rotate进行相应旋转.

    • 已标记为答案 heller灬 2014年11月8日 3:06
    2014年11月4日 1:28