2009-12-16 6 views
1

MouseLeftButton의 Window에 대해 DragMove()를 호출하기위한 컨트롤이 필요하지만 클릭 할 때 여전히 작동합니다.C# WPF - DragMove 및 클릭하십시오.

DragMove()가 호출되면 DragMove()가 마우스 버튼을 놓을 때까지 차단 호출이므로 Click 및 MouseLeftButtonUp이 실행되지 않습니다.

누군가이 해결 방법을 알고 있습니까?

나는 그것이 100 밀리 초보다 더 빨리의 경우 클릭이 작업을 수행 할 수 있습니다 Thread.sleep를 기반으로 해킹을 시도하지만 사용자에게 안정적으로 작동하지 않습니다

   ThreadPool.QueueUserWorkItem(_ => 
        { 
         Thread.Sleep(100); 

         Dispatcher.BeginInvoke((Action) 
          delegate 
          { 
           if (Mouse.LeftButton == MouseButtonState.Pressed) 
           { 
            window.DragMove(); 
           } 
          }); 
        }); 

편집 : 그럼이 해킹했다. ..

   window.DragMove(); 
       RaiseEvent(new MouseButtonEventArgs(e.MouseDevice, e.Timestamp, MouseButton.Left) 
        { 
         RoutedEvent = MouseLeftButtonUpEvent 
        }); 

누구나 더 나은 사람이 있습니까?

+0

윈도우를 드래그하는 동안 클릭/마우스 업이 필요합니까? –

+0

우리의 디자인은 구석에 DragMove를 허용하는 아이콘을 가지고 있습니다 만, 그것을 클릭하면 창의 일부분에서 패널 확장을 토글합니다. – jonathanpeppers

답변

2

위의 편집이 최선의 해결책이라고 생각합니다.

0

두 동작을 모두 원할 경우 마우스를 아래로 이동하고 마우스 이동 이벤트를 모두 트래핑해야합니다.

 if (e.LeftButton == MouseButtonState.Pressed) { 
     Point position = e.GetPosition(Scope); 
     if (Math.Abs(position.X - StartPoint.X) > SystemParameters.MinimumHorizontalDragDistance || 
      Math.Abs(position.Y - StartPoint.Y) > SystemParameters.MinimumVerticalDragDistance) { 
      StartDrag(e); 
     } 
    } 

을 :

StartPosition = event.GetPosition(ui_element); 

그런 다음 마우스에 마우스 버튼이 눌러져 여전히 마우스가 충분히 이동 한 경우에만 드래그를 시작으로 이동 : 마우스에서 아래로는 현재 마우스 위치를 저장 SystemParameters 객체는 Windows의 움직임을 정의합니다.

+0

StartDrag 메서드는 어떤 기능을합니까? Left 속성과 Top 속성 만 설정하고 있습니까? 나는 그것이 XP에서 끔찍하게 깜박일 것이라고 생각합니다. – jonathanpeppers

+0

StartDrag()는 내가하는 드래그/드롭 처리를 수행하는 개체의 메서드 일뿐입니다. 나는 당신이 DragMove()를 호출했을 때, 그 시간에 필요한 것으로 바꾸었다. 이것은 Drap/Drop 도우미 클래스에서 제거되었습니다. –

+0

그러면 예제가 작동하지 않습니다. DragMove()는 위의 해킹 중 하나를 사용하지 않는 한 MouseLeftButtonUp이 시작되는 것을 차단합니다. 그리고 제 2가 지금까지 아름답게 작동합니다. 단지 추한 것입니다. – jonathanpeppers

관련 문제