2012-02-14 98 views
3

嘗試使用拇指在畫布上移動控件時遇到了奇怪的行爲。當我將控件添加到畫布並使用Thumb DragDelta事件將其移到一切看起來不錯時。但是當我將旋轉變換應用到控件時,拖動它變得異常怪異。控件開始繞光標旋轉,角度越大,圓圈越大。使用拇指移動已轉換的控件會產生奇怪的行爲

有誰知道如何使用變形元素進行拇指工作?我花了整整一天的時間試圖弄明白,沒有什麼聰明的想法。

感謝您的幫助!

+0

這之前檢查任何改造取決於你如何實現移動 – 2012-02-14 22:16:47

+0

我正在採取e.Horizo​​ntalChange和e.VerticalChange,然後在Canvas.SetTop()和Canvas.SetLeft()中使用它們。那是你在說什麼? – chiefanov 2012-02-14 22:28:12

+0

另外你在哪裏(在哪個屬性上)應用旋轉變換? – 2012-02-14 22:31:46

回答

0

看來,拇指Horizo​​ntalChange和VerticalChange當拇指旋轉不發揮很好。所以,我只是在畫布中使用光標位置來獲取我的左側和頂部偏移量。它不完全準確,但它足夠接近我想要做的事情。

1

如果溝畫布屬性,並在一個TransformGroup正確的順序應用運動,它應該工作:

<Thumb.RenderTransform> 
    <TransformGroup> 
     <TranslateTransform x:Name="translation" /> 
     <RotateTransform ... /> 
    </TransformGroup> 
</Thumb.RenderTransform> 
translation.X += e.HorizontalChange; 
translation.Y += e.VerticalChange; 

如果該組中開關的順序,你會得到相同的行爲時使用Canvas.Left/Top

(如果您的動畫旋轉,這將幫你)

+0

這個效果更好,但是旋轉現在圍繞畫布的左上角進行,而不是圍繞旋轉的項目本身。任何關於如何修復的建議? – chiefanov 2012-02-15 15:52:21

+0

所以你在動畫旋轉? – 2012-02-15 15:55:25

+0

不,我在DragDelta事件結束時對旋轉的項目調用InvalidateMeasure()。會影響它嗎? – chiefanov 2012-02-15 16:02:13

8

如果將任何旋轉變換應用於FrameworkElement,則表示與其關聯的座標網格已旋轉。因此,此FrameworkElement的任何事件處理程序都將在自己的座標網格中接收位置值。

void DragThumb_DragDelta(object sender, DragDeltaEventArgs e) 
{ 
    //You can use this values when RotateTransform is null 
    double deltaHorizontal = e.HorizontalChange; 
    double deltaVertical = e.VerticalChange; 

    //Transform coordinates 
    Vector v = Math2DHelper.RotateVector2d(e.HorizontalChange, e.VerticalChange, Math2DHelper.D2R(rotationInDegrees)); 

    //Right values 
    deltaHorizontal = v.X; 
    deltaVertical = v.Y; 

    ... 
} 

樣品math2D幫手

public static class Math2DHelper 
{ 
    public static Vector RotateVector2d(double x0, double y0, double rad) 
    { 
     Vector result = new Vector(); 
     result.X = x0 * Math.Cos(rad) - y0 * Math.Sin(rad); 
     result.Y = x0 * Math.Sin(rad) + y0 * Math.Cos(rad); 
     return result; 
    } 

    public static double D2R(double degree) 
    { 
     return (degree%360)*Math.PI/180; 
    } 
} 
2

我遇到了這個問題,並找到了解決辦法,也許有人覺得它有用,你需要拖動拇指

private void Thumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) 
    { 
     var thumb = dts as UIElement; 
     var transform = thumb.RenderTransform as RotateTransform; 
     Point dragDelta = new Point(e.HorizontalChange, e.VerticalChange); 

      if (transform != null) 
      { 
       dragDelta = transform.Transform(dragDelta); 
      } 

      Canvas.SetLeft(thumb, Canvas.GetLeft(thumb) + dragDelta.X); 
      Canvas.SetTop(thumb, Canvas.GetTop(thumb) + dragDelta.Y); 

    }