我尝试使用拇指在画布上移动控件时遇到了一种奇怪的行为。当我向画布添加一个控件并使用Thumb DragDelta事件移动它时,一切看起来都不错。但是当我将旋转变换应用于控件时,拖动它是奇怪的。控件开始围绕光标旋转,角度越大圆圈越大。
有没有人知道如何使用转换后的元素制作拇指?我花了一整天时间试图解决这个问题,并没有想到任何聪明的东西。
感谢您的帮助!
答案 0 :(得分: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;
}
}
答案 1 :(得分:3)
我遇到了这个问题并找到了解决方案,也许有人发现它有用,你需要在拖动拇指之前检查任何转换
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);
}
答案 2 :(得分:1)
如果您放弃Canvas属性并在TransformGroup
中以正确的顺序应用移动,它应该有效:
<Thumb.RenderTransform>
<TransformGroup>
<TranslateTransform x:Name="translation" />
<RotateTransform ... />
</TransformGroup>
</Thumb.RenderTransform>
translation.X += e.HorizontalChange;
translation.Y += e.VerticalChange;
如果您在组中切换订单,则会获得与使用Canvas.Left
/ Top
时相同的行为。
(如果你为旋转设定了动画,这将不帮助你)
答案 3 :(得分:0)
当拇指旋转时,Thumb的HorizontalChange和VerticalChange似乎不能很好地播放。所以,我只是在画布中使用光标位置获取我的左侧和顶部偏移。它不完全准确,但它足够接近我正在尝试做的事情。