2011-02-16 2 views
1

두 개의 이벤트 처리기를 사용하는 경우 PreviewMouseLeftButtonDown 및 PreviewMouseMove. 내가 겪고있는 문제는 PreviewMouseLEftButtonDown이 트리거 될 때 모든 것이 잘 작동하지만 드래그 앤 드롭 작업이므로 왼쪽 버튼이 그대로 유지된다는 것입니다. 그들은 아래 왼쪽 버튼을 누르고있는 동안 그래서, PreviewMouseMove 이벤트 핸들러가 처리해야하지만, 그들이 여기WPF 드래그 앤 드롭 - PreviewMouseMove + PreviewMouseLeftButtonDown 캔트가 함께 작동합니까?

먼저 무엇을 호출되고있는 마우스 왼쪽 버튼을 해제 할 때까지 호출되지 않는

private void FieldItemGrid_PreviewMouseLeftButtonDown(object sender, MouseEventArgs e) 
    { 
     down = e.GetPosition(this); 
     Grid fieldItemGrid = (Grid)sender; 

     fieldItemGrid.Background = Brushes.White; 
     _isDown = true; 
     _startPoint = e.GetPosition(this); 
     _originalElement = fieldItemGrid; 
     this.CaptureMouse(); 
     e.Handled = true; 


     _selectedElement = fieldItemGrid; 
     DragStarted(e.GetPosition(this)); 
    } 

모든 것은 여기에서 잘 작동하지만, 유지, 그것은

private void FieldItemGrid_PreviewMouseMove(object sender, MouseEventArgs e) 
    { 

     if (_isDown) 
     { 
      if (_selectedElement != null) 
      { 
       DragDrop.DoDragDrop(_selectedElement, _selectedElement, DragDropEffects.Move); 
      } 
      if (_isDragging) 
      { 
       DragMoved(e.GetPosition(this)); 
      } 

     } 
    } 

PreviewMouseMove

에 대해 다음 핸들러를 실행하지 않는 동안 그들이이 주위에 방법이 있나요 마우스를 이동하는 경우 문제는 무엇입니까? 그래서 왼쪽 마우스 버튼을 놓기 전에 다른 이벤트 핸들러를 치는 것을 막지는 않습니까?

답변

2

thisGrid이 아니라면 this.CaptureMouse()이라고 말하면 Grid을 포함한 다른 요소가 마우스 이벤트를받지 못하게됩니다. 드래그 앤 드롭의 경우 마우스를 전혀 캡처 할 필요가 없을 수도 있지만 마우스를 캡처하는 경우 캡처가 해제되기 전에 마우스 이동 핸들러를 호출하려면 fieldItemGrid.CaptureMouse()을 사용해야합니다.

0

잠시 동안이 질문에 대한 답변을 얻었으므로 너무 자세히 설명하지는 않겠지 만 동일한 문제가있는 다른 사용자를 위해 DragDrop.DoDragDrop()를 사용하여 끌어서 놓기를 구현할 수도 있습니다.) 메서드를 소스에서 코드 숨김으로 마우스 단추를 클릭 할 때. 대상에서 XAML에서 "AllowDrop"을 true로 설정하고 "Drop"메서드를 처리합니다. 귀하의 구현은 다르지만 같은 모양 : 당신이 (예를 위해 문자열 속성을 통과) 같은 것을해야합니다 대상의 "드롭"이벤트 처리기에서 다음

private void MyUIElement_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
    { 
     //find the clicked row 
     var tempObject = e.Source as [whatever]; 
     if (tempObject == null) return; 

     DragDrop.DoDragDrop(tempObject, tempObject.PropertyToBePassed, DragDropEffects.Copy); 
    } 

과 :

private void MyTarget_Drop(object sender, DragEventArgs e) 
    { 
     string myNewItem = (string)e.Data.GetData(DataFormats.StringFormat); 
     Debug.WriteLine("I just received: " + myNewItem); 
    } 

아직 마우스 이벤트를 캡처하지는 않지만 많은 경우 똑같은 작업을 신속하고 쉽게 수행 할 수 있습니다.