2011-03-07 32 views
1

我試圖拖動A處的圓,使得在其周圍產生的角度相對於所述隱藏中心元素的,B.WPF:應用的RenderTransform使得爲getPosition是相對於中心,而不是左上

我「M使用MouseEventArgs.GetPosition(IInputElement relativeTo),所以:

Point p = args.GetPosition(B) 

我得到相對於左上角B的,不是它的中心點,儘管B.

設定的0.5 RenderTransformOrigin,0.5我知道,我可以手動計算正確的偏移量:Easiest way to get the angle of mouse position in WPF relative to the center of a circle

enter image description here

回答

3

RenderTransformOrigin指定施加B.設置它本身不改變B的位置的任何RenderTransform的相對原點,所以它不會影響e.GetPosition(B)任一。 「在我的座標空間中給我鼠標的位置,不管你如何改變這個座標空間(通過應用一個渲染變換),相對來說,B的中心總是會在它的中間這取決於它的大小,所以你需要計算它的中心點

另外當你計算角度時,你需要確保你使用的是同一個座標空間,這段代碼在Centre上旋轉A ,不管它們如何定位:

Point? dragStart; 
    Point centrePoint; 

    private void A_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     var handle = sender as FrameworkElement; 
     var parent = handle.Parent as FrameworkElement; 

     dragStart = e.GetPosition(parent); 

     var rotateCentre = Centre.TransformToVisual(A).Transform(new Point(Centre.ActualWidth/2, Centre.ActualHeight/2)); 
     A.RenderTransform = new RotateTransform { CenterX = rotateCentre.X, CenterY = rotateCentre.Y }; 

     centrePoint = Centre.TransformToVisual(handle.Parent as FrameworkElement).Transform(new Point(Centre.ActualWidth/2, Centre.ActualHeight/2)); 
     handle.CaptureMouse(); 
    } 

    private void A_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (dragStart != null) 
     { 
      var current = e.GetPosition((sender as FrameworkElement).Parent as FrameworkElement); 

      var angle = RadiansToDegrees(AngleAtoB(dragStart.Value, current, centrePoint)); 

      (A.RenderTransform as RotateTransform).Angle = angle; 
     } 
    } 

    private void A_LostMouseCapture(object sender, MouseEventArgs e) 
    { 
     dragStart = null; 
    } 

    private void A_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     (sender as FrameworkElement).ReleaseMouseCapture(); 
    } 

    internal static double AngleWithHorizontal(Point point, Point origin) 
    { 
     return Math.Atan2(point.Y - origin.Y, point.X - origin.X); 
    } 

    internal static double AngleAtoB(Point a, Point b, Point origin) 
    { 
     return AngleWithHorizontal(b, origin) - AngleWithHorizontal(a, origin); 
    } 

    private const double Const180OverPi = 180/Math.PI; 

    internal static double RadiansToDegrees(double angleInDegrees) 
    { 
     return angleInDegrees * Const180OverPi; 
    } 
相關問題