WPF拖动距离阈值

9

我有一个包含两个WPF树形视图的程序,允许在两者之间拖放。问题是,打开/关闭树形视图中的项目可能会很烦人,因为只要鼠标移动一像素并按住左键,就会触发拖放功能。是否有办法指定鼠标移动多远才被认为是拖放?

3个回答

20

这个可以通过系统参数来实现。如果你有

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

在实现拖放的this文章中,您需要处理两个鼠标事件,以延迟拖动直到鼠标移动一定距离。首先,添加一个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(...);
    }
  }
}

1

在您的代码中加入一个小缓冲区,以确定拖动何时开始。

  1. 标记鼠标按下
  2. 在鼠标移动时-检查鼠标是否按下。如果是,则检查它是否移动了比您指定的缓冲区更远(3像素可能很好)
  3. 如果是,则开始拖动。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接