2013-04-25 171 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