2013-04-25 130 views
2

当鼠标移动时,我尝试旋转一个矩形。
我的代码:旋转一个矩形

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++; 
+0

好吧,在它的表面上我会说你没有设置角度('i'总是为'0'),并且你将中心值设置为矩形的中心。所以我并不感到惊讶没有发生任何事情。 (你实质上是应用了一个什么都不做的转换) – 2013-04-25 21:15:07

+0

不,它确实旋转我的矩形,每当鼠标位置改变时,我都会增加它,所以它旋转我的矩形,但它像第一张图片一样旋转它:[image] (http://i.msdn.microsoft.com/dynimg/IC1813.gif),我想让它像第二张照片。 – Finchsize 2013-04-25 21:18:25

+0

“Canvas.GetLeft(rect)”和“rect.Width”的值的调试器状态是什么? – 2013-04-25 21:21:30

回答

4

我猜你真正想要的是一个RenderTransformRenderTransformOrigin在矩形的中心:

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

写鼠标移动处理程序是这样的:

double angle = 0; 

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

顺便说一句,你的方法应该省略Canvas.Left和Canvas.Top值。变换是相对于元素的坐标而不是容器的坐标。 – Clemens 2013-04-25 21:51:29

+0

恩,感谢您的回答,但我刚刚找到了解决方案:) – Finchsize 2013-04-25 22:05:50

+0

您的“解决方案”非常需要改进。首先,在应用转换之前将Canvas.Left和Canvas.Top设置为零是毫无意义的,因为转换是相对于元素的原点。其次,将rotation.CenterX设置为Width/2并且rotation.CenterY到Height/2不是必需的,因为您可以通过RenderTransformOrigin(0.5,0.5)简单地在相对坐标中设置一次变换中心。最后,不需要每次都创建一个新的RotateTransform。只需设置现有的Angle属性即可。 – Clemens 2013-04-27 21:38:31