我在尝试使用拇指移动画布上的控件时遇到了奇怪的行为。当我将控件添加到画布并使用Thumb DragDelta事件来移动它时,一切看起来都很好。但是当我对控件应用旋转变换后,拖动它就变得很奇怪。控件开始围绕光标旋转,角度越大,圆圈就越大。
有人知道如何使拇指与变换后的元素配合工作吗?我已经花了一整天的时间尝试解决这个问题,但没有什么好的想法。
谢谢你的帮助!
有人知道如何使拇指与变换后的元素配合工作吗?我已经花了一整天的时间尝试解决这个问题,但没有什么好的想法。
谢谢你的帮助!
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);
}
如果你放弃Canvas属性,并按正确的顺序在TransformGroup
中应用移动,它应该可以工作:
<Thumb.RenderTransform>
<TransformGroup>
<TranslateTransform x:Name="translation" />
<RotateTransform ... />
</TransformGroup>
</Thumb.RenderTransform>
translation.X += e.HorizontalChange;
translation.Y += e.VerticalChange;
如果你在组中切换顺序,你会得到与使用Canvas.Left
/Top
相同的行为。
(如果你对旋转进行了动画处理,这将无法帮助你)
看起来当Thumb旋转时,HorizontalChange和VerticalChange不太兼容。因此,我只是使用画布中的光标位置获取左侧和顶部偏移量。虽然不完全准确,但对于我想要做的事情来说足够接近了。