尝试使用拇指在画布上移动控件时遇到了奇怪的行为。当我将控件添加到画布并使用Thumb DragDelta事件将其移到一切看起来不错时。但是当我将旋转变换应用到控件时,拖动它变得异常怪异。控件开始绕光标旋转,角度越大,圆圈越大。使用拇指移动已转换的控件会产生奇怪的行为
有谁知道如何使用变形元素进行拇指工作?我花了整整一天的时间试图弄明白,没有什么聪明的想法。
感谢您的帮助!
尝试使用拇指在画布上移动控件时遇到了奇怪的行为。当我将控件添加到画布并使用Thumb DragDelta事件将其移到一切看起来不错时。但是当我将旋转变换应用到控件时,拖动它变得异常怪异。控件开始绕光标旋转,角度越大,圆圈越大。使用拇指移动已转换的控件会产生奇怪的行为
有谁知道如何使用变形元素进行拇指工作?我花了整整一天的时间试图弄明白,没有什么聪明的想法。
感谢您的帮助!
看来,拇指HorizontalChange和VerticalChange当拇指旋转不发挥很好。所以,我只是在画布中使用光标位置来获取我的左侧和顶部偏移量。它不完全准确,但它足够接近我想要做的事情。
如果沟画布属性,并在一个TransformGroup
正确的顺序应用运动,它应该工作:
<Thumb.RenderTransform>
<TransformGroup>
<TranslateTransform x:Name="translation" />
<RotateTransform ... />
</TransformGroup>
</Thumb.RenderTransform>
translation.X += e.HorizontalChange;
translation.Y += e.VerticalChange;
如果该组中开关的顺序,你会得到相同的行为时使用Canvas.Left
/Top
。
(如果您的动画旋转,这将不帮你)
如果将任何旋转变换应用于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;
}
}
我遇到了这个问题,并找到了解决办法,也许有人觉得它有用,你需要拖动拇指
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);
}
这之前检查任何改造取决于你如何实现移动 – 2012-02-14 22:16:47
我正在采取e.HorizontalChange和e.VerticalChange,然后在Canvas.SetTop()和Canvas.SetLeft()中使用它们。那是你在说什么? – chiefanov 2012-02-14 22:28:12
另外你在哪里(在哪个属性上)应用旋转变换? – 2012-02-14 22:31:46