C# 从代码更改RenderTransferMorigin

C# 从代码更改RenderTransferMorigin,c#,wpf,annotations,C#,Wpf,Annotations,我需要更改一些注释对象的RenderTransferMorigin属性,以便它们始终围绕另一侧x的中心y旋转 假设用户单击对象的右侧,则旋转点将为0.0,0.5,但如果用户希望更改项目另一侧的旋转,则可以单击项目的左侧,在这种情况下,旋转点将变为1.0,0.5 问题:我请求帮助的原因是,每当发生这种情况时,项目都会跳到屏幕上。它移动的程度取决于项目的角度,如果它根本不旋转,那么它就不会移动。在移动过程中,角度本身不会改变,只会改变位置。我意识到,没有图像就有点难以理解问题,但由于stackove

我需要更改一些注释对象的RenderTransferMorigin属性,以便它们始终围绕另一侧x的中心y旋转

假设用户单击对象的右侧,则旋转点将为0.0,0.5,但如果用户希望更改项目另一侧的旋转,则可以单击项目的左侧,在这种情况下,旋转点将变为1.0,0.5

问题:我请求帮助的原因是,每当发生这种情况时,项目都会跳到屏幕上。它移动的程度取决于项目的角度,如果它根本不旋转,那么它就不会移动。在移动过程中,角度本身不会改变,只会改变位置。我意识到,没有图像就有点难以理解问题,但由于stackoverflow的规则,我不允许附加图像以简化操作。因此,这仅在选择另一侧时发生,例如,在右手侧之后单击左手侧,移动/跳跃取决于角度。角度越大,跳跃越大

我想做的是更改所提到的属性,使旋转围绕对象的选定边进行,而不使对象在更改边时一直上下跳跃

谢谢你的帮助

编辑[2015-03-10_12-17-21]

class XYZ  
{  
...  
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);

    double relativeCenterX = ((selectedThumb == ThumbPosition.Left) ? (1.0D) : (0.0D));
    double relativeCenterY = 0.5D;

    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();
}

...
}
如果没有,很难确定需要做什么来修复代码

也就是说,从描述中,我觉得您应该使用RotateTransform.CenterX和RotateTransform.CenterY属性,而不是设置RenderTransferOrigin

例如:

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

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

    double relativeCenterX = ((selectedThumb == ThumbPosition.Left) ? (1.0D) : (0.0D));
    double relativeCenterY = 0.5D;

    m_rotateTransform.CenterX = relativeCenterX;
    m_rotateTransform.CenterY = relativeCenterY;

    // Without a complete example, I'm not sure I know what this part is
    // supposed to be doing. I think it's fine, but maybe it needs to be
    // fixed too?
    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);
}

在看不到任何图像的情况下,很明显,如果更改现有RotateTransform的原点,变换后的形状会以某种方式移动。我忘了添加一点,即更改RotateTransform的CenterX和CenterY属性会产生类似的效果,即使对象的旋转或大小根本没有更改。因此,通过改变旋转中心,只改变其位置。知道如何避免这种跳跃吗?当然知道。您可能需要有一个带有两个旋转变换或类似内容的变换组。没有看过你的代码就很难说。你是对的;我粘贴了相关代码!谢谢你的评论!不幸的是,正如我前面提到的,设置CenterX和CenterY属性会导致相同的问题。顺便说一句,代码几乎已经完成了,除了这里不相关的东西。我想做的很简单:只是试着从左边和右边旋转一个项目,同时将旋转的中心点改到另一边。@a14:对不起。。。我没看到那张纸条。这真的应该是问题本身的一部分……评论是我们要求你们澄清的;实际的澄清属于问题。就代码示例而言,它是WPF,因此如果没有XAML,您将丢失至少一半的代码。无论如何,几乎完成了!=完成我真的认为CenterX和CenterY是您所需要的,但如果没有完整的代码示例,就不清楚它们为什么不适合您。