2012-02-14 41 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); 

    }