WPF порог расстояния сопротивления - PullRequest
8 голосов
/ 15 января 2010

У меня есть программа с двумя деревьями WPF, которые позволяют перетаскивать их между собой. Проблема в том, что открывать / закрывать элементы в древовидных представлениях может быть неприятно, потому что перемещение мыши всего на один пиксель при удерживании левой кнопки мыши вызывает функцию перетаскивания. Есть ли способ указать, как далеко должна двигаться мышь, прежде чем она будет считаться перетаскиванием?

Ответы [ 3 ]

17 голосов
/ 13 марта 2010

Для этого есть системный параметр. Если у вас есть

Point down = {where mouse down event happened}
Point current = {position in the MouseMove eventargs}

тогда мышь переместилась на минимальное расстояние сопротивления, если

Math.Abs(current.X - down.X) >= SystemParameters.MinimumHorizontalDragDistance ||
Math.Abs(current.Y - down.Y) >= SystemParameters.MinimumVerticalDragDistance)
1 голос
/ 15 января 2010

Просто создайте небольшой буфер в вашем коде, который определяет, когда начинается перетаскивание.

  1. флаг мыши вниз
  2. при перемещении мыши - проверьте, не нажата ли мышь. Если да, проверьте, не переместился ли он дальше указанного вами буфера (вероятно, 3 пикселя хорошо)
  3. если есть, начните перетаскивание.
0 голосов
/ 26 октября 2017

После этой статьи для реализации перетаскивания вам потребуется обработать 2 события мыши, чтобы отложить перетаскивание до тех пор, пока мышь не переместится на определенное расстояние. Сначала добавьте обработчик для PreviewMouseDown, который хранит начальную позицию мыши относительно вашего элемента управления. Не используйте событие MouseDown, так как оно является пузырчатым событием и, возможно, было обработано дочерним элементом управления до достижения вашего элемента управления.

public class DraggableControl : UserControl
{
  private Point? _initialMousePosition;

  public DraggableControl()
  {
    PreviewMouseDown += OnPreviewMouseDown;
  }

  private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e) {
    _initialMousePosition = e.GetPosition(this);
  }

Кроме того, обработайте MouseMove, чтобы проверить пройденное расстояние и в конечном итоге инициировать операцию перетаскивания:

  ...
  public DraggableControl()
  {
    ...
    MouseMove += OnMouseMove;
  }
  ...
  private void OnMouseMove(object sender, MouseEventArgs e)
  {
    // Calculate distance between inital and updated mouse position
    var movedDistance = (_initialMousePosition - e.GetPosition(this)).Length;
    if (movedDistance > yourThreshold)
    {
      DragDrop.DoDragDrop(...);
    }
  }
}
...