WPF: перетаскивание элемента с помощью Touch довольно изменчиво - PullRequest
1 голос
/ 31 марта 2011

У меня есть Прямоугольник, который можно перетащить в некоторые границы.Это прекрасно работает с мышью.

Как только я установил IsManipulationEnabled в true, события мыши больше не работают.Однако мне нужно это, чтобы получить сенсорные события на прямоугольнике.Поэтому я установил его в true.

Я пытаюсь вычислить все изменения в событии ManipulationDelta, как в следующей функции.Масштабирование работает уже довольно хорошо, но перемещение объекта путем перетаскивания его пальцем очень изменчиво + плюс иногда прямоугольник перепрыгивает назад и вперед.

private void UserControl_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
    //Scaling works already pretty good
    RangeBar.Width *= e.DeltaManipulation.Scale.X;

    //Moving the element is very choppy, what am I doing wrong here?
    this.startX = this.startX + e.DeltaManipulation.Translation.X;
    RangeBar.SetValue(Canvas.LeftProperty, startX);
}

1 Ответ

1 голос
/ 31 марта 2011

Вместо этого я бы попробовал использовать CumulativeManipulation.

Всякий раз, когда мне нужно сделать перемещение элемента пользовательского интерфейса с помощью перетаскивания, я не пытаюсь повторно использовать одну и ту же переменную и изменять ее дельтой, а затем повторно использовать эту же переменную для установки положения. Это почти всегда дает мне проблемы со стабильностью независимо от платформы. Вместо этого попробуйте сохранить переменную при начале перетаскивания и добавить дельту к этой переменной только тогда, когда вам нужно обновить позицию. Так что-то вроде этого:

Точка происхождения;

void MouseDown (расположение точки) { происхождение = местоположение; }

void MouseDrag (Vector cumulativeOffset) { SetControlLocation (происхождение + cumulativeOffset); }

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

...