Использование большого пальца для перемещения преобразованного элемента управления приводит к странному поведению - PullRequest
4 голосов
/ 15 февраля 2012

Я столкнулся со странным поведением, когда пытался использовать большой палец для перемещения элемента управления на холсте. Когда я добавляю элемент управления к холсту и использую событие Thumb DragDelta, чтобы переместить его, все выглядит хорошо. Но когда я применяю преобразование поворота к элементу управления, перетаскивание его становится странным. Элемент управления начинает вращаться вокруг курсора, и чем больше угол, тем больше круг.

Кто-нибудь знает, как заставить большой палец работать с преобразованным элементом? Я провел весь день, пытаясь понять это, и ничего умного не приходит мне в голову.

Спасибо за вашу помощь!

Ответы [ 4 ]

8 голосов
/ 16 июля 2014

Если вы применяете любое вращающееся преобразование к 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;
    }
}
4 голосов
/ 13 мая 2016

Я сталкивался с этой проблемой и нашел решение, может быть, кто-то посчитает его полезным, перед перетаскиванием нужно проверить любое преобразование

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

    }
1 голос
/ 15 февраля 2012

Если вы отбросите свойства Canvas и примените движение в правильном порядке в TransformGroup, это должно сработать:

<Thumb.RenderTransform>
    <TransformGroup>
        <TranslateTransform x:Name="translation" />
        <RotateTransform ... />
    </TransformGroup>
</Thumb.RenderTransform>
translation.X += e.HorizontalChange;
translation.Y += e.VerticalChange;

Если вы переключаете порядок в группе, вы получаете то же поведение, что и при использовании Canvas.Left / Top.

(Если вы анимировали вращение, это не поможет вам)

0 голосов
/ 20 февраля 2012

Похоже, что Thumb's HorizontalChange и VerticalChange не играют хорошо, когда вращается большой палец.Итак, я просто использую расположение курсора на холсте, чтобы получить левое и верхнее смещение.Это не совсем точно, но достаточно близко для того, что я пытаюсь сделать.

...