2011-04-30 4 views
2

그건 내 창을 드래그해야하는 코드입니다. 그것은 다소 일한다! 내가 마우스가 너무 빨리 이동하는 경우 종류의 ...WPF에서 보드를 덜 끌어서 이동하는 방법 - 효율적으로 수행하는 방법?

Private Point startPoint; 

private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 

    startPoint = e.GetPosition(null); 
} 
private void Window_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.LeftButton == MouseButtonState.Pressed) 
    { 
     Point relative = e.GetPosition(null); 
     Point AbsolutePos = new Point(relative.X + this.Left, relative.Y + this.Top); 
     this.Top = AbsolutePos.Y - startPoint.Y; 
     this.Left = AbsolutePos.X - startPoint.X; 
    } 
} 

문제는이 창 밖으로 이동하고 movemouse의 이벤트를 발생 중지입니다. 둘째로, 드래그 윈도우가 전혀 부드럽 지 않아서 올바른 방법으로하지 않는다고 믿게합니다. 셋째, 마우스 클릭 한 번만 이벤트를 발생시키는 Window_MouseLeftButtonDown에서이 작업을 시도했습니다. 저는 초보자입니다. Dropping과 Data Transfer가없는 간단한 예제는 나와 나 같은 많은 초보자들에게 감사 할 것입니다. 기꺼이 Stack OverFlow 사용자에게 도움을 청합니다.

답변

0

마우스를 놓치는 것은 마우스 캡처에 실패한 결과입니다. 표준 절차는 다음과 같습니다

  • 마우스 다운 이벤트에 capture the mouse하고 버튼 마우스 업 이벤트에
  • release the mouse capture 우울 경우
  • 마우스 이동 이벤트에 마우스 움직임을 처리 마우스 위치를 기록하고 수행 모든 최종 프로세싱

성능면에서 볼 때 올바른 방향으로 가고 있습니다. 속도는 윈도우 자체의 재 페인트와 윈도우가 지나가는 윈도우, 컴퓨터가 얼마나 빨리 빠져 있는지, 그리고 컴퓨터를 드래그하는 동안 컴퓨터에서 진행되고있는 다른 작업에 의해 제한됩니다.

+0

는 WPF처럼 보인다 갈 수 있습니다, 그것은 부드러운하지만 WPF 창 제스처 조금 간다. 저는 Eugen의 답변을 시도했습니다. 그 한 줄로 모든 결과를 얻으려는 모든 코드를 대체하는 기적을 만듭니다. 창은 여전히 ​​내 코드처럼 움직이지만, 더 이상 포인터를 풀지 않습니다. – user722886

+0

가이드 라인을 보내 주셔서 감사합니다. 직접 효율적인 코드를 만들 수 있는지 다시 한 번 알려 드리겠습니다. 고마워. – user722886

2

솔루션은 실제로 생각보다 간단합니다. 메모장 주위 드래그, 꽤 무거운 기술은이 라인을 생성자에

MouseDown += delegate { DragMove(); }; 

를 놓고 당신이 :)

+0

감사합니다 Eugen,이 아름다운 라인을 찾을 수 없습니다 googlewhere, 잘 작동하지만 거래가 WPF 때 창문은 여전히 ​​제스처, 내 컴퓨터 성능이 있어야합니다. – user722886

+0

그것은 그래픽 카드 여야합니다. 그것은 매우 부드럽게 움직입니다. 나는 nVidia GTX 570을 가지고있다. – Eugen

관련 문제