WPF拖动距离阈值

时间:2010-01-14 22:44:53

标签: c# wpf drag-and-drop treeview

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

3 个答案:

答案 0 :(得分:16)

这有一个系统参数。如果你有

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 :(得分:1)

只需在代码中构建一个缓冲区即可确定拖动的开始时间。

  1. 标记鼠标
  2. 鼠标移动 - 检查鼠标是否...如果是,检查它是否比你指定的任何缓冲区移动得更远(3像素可能是好的)
  3. 如果有,请开始拖动。

答案 2 :(得分:0)

关于拖放实现的this文章之后,您必须处理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(...);
    }
  }
}