4

尝试使用拇指在画布上移动控件时,我遇到了一种奇怪的行为。当我将控件添加到画布并使用 Thumb DragDelta 事件来移动它时,一切看起来都很好。但是当我对控件应用旋转变换时,拖动它是很奇怪的。控件开始围绕光标转圈,角度越大圈圈越大。

有谁知道如何使拇指与转换后的元素一起工作?我花了一整天的时间试图弄清楚,但没有什么聪明的想法出现在我的脑海中。

谢谢你的帮助!

4

4 回答 4

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;
    }
}
于 2014-07-16T17:32:46.937 回答
4

我遇到了这个问题并找到了解决方案,也许有人觉得它有帮助,你需要在拖动拇指之前检查任何转换

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);

    }
于 2016-05-13T06:31:30.497 回答
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

(如果您为旋转设置动画,这将无济于事

于 2012-02-14T22:44:12.350 回答
0

拇指旋转时,拇指的 Horizo​​ntalChange 和 VerticalChange 似乎不能很好地播放。所以,我只是在画布中使用光标位置来获取我的左侧和顶部偏移量。它并不完全准确,但对于我想要做的事情来说已经足够接近了。

于 2012-02-20T15:57:53.740 回答