C# 拖曳距离阈值

C# 拖曳距离阈值,c#,wpf,drag-and-drop,treeview,C#,Wpf,Drag And Drop,Treeview,我有一个带有两个WPF TreeView的程序,允许在两者之间拖放。问题是,在TreeView上打开/关闭项目可能会很烦人,因为在按住鼠标左键的同时只移动鼠标一个像素会触发拖放功能。是否有某种方法可以指定鼠标在被视为拖放之前应该移动多远?只需在代码中构建一个小缓冲区,以确定何时开始拖动 放下鼠标 鼠标移动时-检查鼠标是否向下移动。。如果是,请检查其移动是否超过指定的缓冲区(3像素可能比较好) 如果有,开始拖动 这有一个系统参数。如果你有 Point down = {where mouse dow

我有一个带有两个WPF TreeView的程序,允许在两者之间拖放。问题是,在TreeView上打开/关闭项目可能会很烦人,因为在按住鼠标左键的同时只移动鼠标一个像素会触发拖放功能。是否有某种方法可以指定鼠标在被视为拖放之前应该移动多远?

只需在代码中构建一个小缓冲区,以确定何时开始拖动

  • 放下鼠标
  • 鼠标移动时-检查鼠标是否向下移动。。如果是,请检查其移动是否超过指定的缓冲区(3像素可能比较好)
  • 如果有,开始拖动

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

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