2010-01-14 3 views
8

둘 사이의 끌어서 놓기를 허용하는 두 개의 WPF 트리 뷰가있는 프로그램이 있습니다. 마우스 왼쪽 버튼을 누른 채 마우스를 한 픽셀 만 움직이면 드래그/드롭 기능이 트리거되므로 트리 뷰에서 항목을 열거 나 닫는 것이 번거로울 수 있습니다. 끌어서 놓기로 간주하기 전에 마우스를 얼마나 멀리 움직여야 하는지를 지정하는 방법이 있습니까?WPF 끌기 거리 임계 값

+0

당신이 몇 가지 코드를 게시 할 수 :

public class DraggableControl : UserControl { private Point? _initialMousePosition; public DraggableControl() { PreviewMouseDown += OnPreviewMouseDown; } private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e) { _initialMousePosition = e.GetPosition(this); } 

또한, MouseMove 이벤트가 이동 한 거리를 확인하고 결국 드래그 작업을 시작하기 위해 처리? – ChrisF

답변

1

드래그 시작 시점을 결정하는 작은 버퍼를 코드에 빌드하기 만하면됩니다. 플래그 마우스 아래

  • 마우스 이동이

    1. -이 경우 예, 그 멀리 사용자가 지정한 어떤 버퍼보다 ​​이동 있는지 확인하면 .. 아래로 마우스 검사는
    2. (3 개 픽셀 아마 좋은) , 끌기를 시작하십시오.
  • 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) 
    
    0

    은 드래그에 대한 this 기사를 다음과 구현을 드롭 경우 최소 드래그 거리를 이동, 당신은 드래그를 지연하기 위해 2 개 마우스 이벤트를 처리 할 것 마우스가 일정 거리를 이동할 때까지 먼저 컨트롤에 상대적인 초기 마우스 위치를 저장하는 PreviewMouseDown의 처리기를 추가합니다. 버블 링 이벤트이고 컨트롤에 도달하기 전에 자식 컨트롤에 의해 처리되었을 수 있으므로 MouseDown 이벤트를 사용하지 마십시오.

    ... 
        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(...); 
        } 
        } 
    } 
    
    관련 문제