0

我正在尝试使用 RenderTransform 围绕画布上的固定点(比如“A”)旋转 UI 控件。最初,我将 RenderTransformOrigin 属性分配给相对于 UI 控件的相对坐标 A。UI 控件可调整大小。因此,每当我更改 UI 控件的大小时,我都会重新计算 A 的相对坐标,并将其分配给 RenderTransformOrigin。

private void RotateThumb_DragStarted(object sender, DragStartedEventArgs e) {
    m_rotateTransform = m_designerItem.RenderTransform as RotateTransform;

    if (m_rotateTransform == null) {
        m_designerItem.RenderTransform = new RotateTransform(0);
        m_rotateTransform = m_designerItem.RenderTransform as RotateTransform;
    }
    Point positionWithinAnnotation = Mouse.GetPosition(m_designerItem);
    var selectedThumb = GetThumbPosition(m_designerItem, positionWithinAnnotation);

    // code for computation of relativeCenterX and relativeCenterY

    m_designerItem.RenderTransformOrigin = new Point(relativeCenterX, relativeCenterY);
    m_transformOrigin = m_designerItem.RenderTransformOrigin;

    m_rotationPoint = m_designerItem.TranslatePoint(
        new Point(relativeCenterX * m_designerItem.ActualWidth,
                  relativeCenterY * m_designerItem.ActualHeight),
                  m_canvas);

    Point startPoint = Mouse.GetPosition(m_canvas);
    m_startVector = Point.Subtract(startPoint, m_rotationPoint);
}

private void handleRotate(DragDeltaEventArgs e) {
    Point currentPoint = Mouse.GetPosition(m_canvas);
    Vector deltaVector = Point.Subtract(currentPoint, m_rotationPoint);

    double angle = Vector.AngleBetween(m_startVector, deltaVector);
    m_rotateTransform.Angle += Math.Round(angle, 0);
    m_startVector = deltaVector;

    m_designerItem.InvalidateMeasure();
}

此代码适用于调整大小后的第一次旋转。如果我尝试调整旋转后的 UI 元素的大小,然后再次旋转该元素,则该元素会跳转到其他位置。

是否可以避免这种翻译?另外,无论如何我可以分配点的绝对坐标来渲染变换原点,这样就不需要改变了吗?

编辑:我也尝试过使用 RotateTransform 的 CenterX 和 CenterY 属性。但是 UI 元素在 RenderTransformOrigin 处旋转,忽略了 CenterX 和 CenterY 的值

4

0 回答 0