C# 旋转矩形

C# 旋转矩形,c#,wpf,C#,Wpf,我试图在鼠标移动时旋转一个矩形 我的代码: private int i = 0; private void Canvas_MouseMove(object sender, MouseEventArgs e) { RotateTransform rotation = new RotateTransform(); rotation.Angle = i; rotation.CenterX = Canvas.GetLeft(rect) + rect.Width/2; r

我试图在鼠标移动时旋转一个矩形
我的代码:

private int i = 0;

private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
    RotateTransform rotation = new RotateTransform();
    rotation.Angle = i;
    rotation.CenterX = Canvas.GetLeft(rect) + rect.Width/2;
    rotation.CenterY = Canvas.GetTop(rect) + rect.Height/2;
    rect.LayoutTransform = rotation;
    i++;         
}
我想通过矩形的中心进行旋转,但它以另一种方式进行。这句话:

rotation.CenterX = Canvas.GetLeft(rect) + rect.Width/2;
rotation.CenterY = Canvas.GetTop(rect) + rect.Height/2;
什么都不要改变。你知道为什么吗

我在本论坛的另一篇帖子中找到了一个解决方案,因此我的解决方案是:

            double left = Canvas.GetLeft(rect);
            double top = Canvas.GetTop(rect);

            Canvas.SetLeft(rect, 0);
            Canvas.SetTop(rect, 0);

            RotateTransform rotation = new RotateTransform();
            rotation.Angle = i;
            rotation.CenterX = rect.Width/2;
            rotation.CenterY = rect.Height/2;
            rect.RenderTransform = rotation;

            Canvas.SetLeft(rect, left);
            Canvas.SetTop(rect, top);
            i++;  

我猜你实际上想要的是一个在矩形中心有一个的:

<Rectangle Fill="Orange" Width="100" Height="100" RenderTransformOrigin="0.5,0.5">
    <Rectangle.RenderTransform>
        <RotateTransform x:Name="rotateTransform"/>
    </Rectangle.RenderTransform>
</Rectangle>

从表面上看,我想说你没有设置角度(
I
总是
0
),而是将中心值设置为矩形的中心。所以我并不惊讶什么都没发生。(您实际上应用了一个不起任何作用的转换)不,它确实会旋转我的矩形。每次鼠标位置改变时,我的矩形都会增加,因此它会旋转我的矩形,但它旋转的方式与第一张图片中的相同:,我希望它在第二张图片中也一样。调试器对
Canvas.GetLeft(rect)的值的状态是什么
rect.Width
?@Chris Sinclair Debugger什么也没说,这段代码很好,但我需要另一种比例:PI是指用于将旋转应用到对象中心的值不正确。顺便说一句,您的方法应该忽略Canvas.Left和Canvas.Top值。转换是相对于元素的坐标,而不是容器的坐标。好吧,谢谢你的回答,但我刚刚找到了一个解决方案:)你的“解决方案”非常需要改进。首先,在应用转换之前将Canvas.Left和Canvas.Top设置为零是没有意义的,因为转换是相对于元素的原点的。其次,不需要将rotation.CenterX设置为Width/2,将rotation.CenterY设置为Height/2,因为可以通过rendertransferormorigin(0.5,0.5)在相对坐标中简单地设置一次变换中心。最后,没有必要每次都创建一个新的RotateTransform。只需设置现有对象的角度属性。
double angle = 0;

private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
    rotateTransform.Angle = angle; // yes, Angle is a double
    angle += 1;
}