的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;
}