2009-12-02 61 views
2

我正在为我正在编写的项目写一个小的拖放功能。我之前几次完成了这种类型的功能,并且我总是使用PreviewLeftMouseButtonDownPreviewMouseMove的组合来检测拖动的开始。它以前一直很有用。WPF:按鼠标左键时PreviewMouseMove不会触发?

虽然在这个项目中,我发现PreviewMouseMove在点击鼠标左键时不会触发,即使鼠标在屏幕上移动。我已经从来没有之前见过这,这让我很难过。

这是我使用的XAML:

<Grid Background="{StaticResource BGGradientBrush}" 
     Margin="1" 
     PreviewMouseLeftButtonDown="Grid_PreviewMouseLeftButtonDown" 
     PreviewMouseMove="Grid_PreviewMouseMove"> 

     <!-- snip --> 
</Grid> 

这是我的代码背后:

private Point _startDragPoint; 
    private bool _isDragging; 

    private void Grid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     _startDragPoint = e.GetPosition(null); 
     System.Diagnostics.Trace.WriteLine("Test => (PreviewMouseLeftButtonDown) left click at " + _startDragPoint); 
    } 

    private void Grid_PreviewMouseMove(object sender, MouseEventArgs e) 
    { 
     System.Diagnostics.Trace.WriteLine("Test => (PreviewMouseMove) enter, e.LeftButton: " + e.LeftButton + ", _isDragging: " + _isDragging); 

     if (e.LeftButton == MouseButtonState.Pressed && !_isDragging) 
     { 
      System.Diagnostics.Trace.WriteLine(
       "Test => (PreviewMouseMove) well, the left mouse button is pressed"); 

      var position = e.GetPosition(null); 
      if (Math.Abs(position.X - _startDragPoint.X) > SystemParameters.MinimumHorizontalDragDistance || 
       Math.Abs(position.Y - _startDragPoint.Y) > SystemParameters.MinimumVerticalDragDistance) 
      { 
       StartDrag(); 
      } 
     } 
    } 

    private void StartDrag() 
    { 
     System.Diagnostics.Trace.WriteLine("Test => (StartDrag) started drag!"); 
    } 

我通过DebugView中监测这些跟踪语句和时间之间Grid_PreviewMouseLeftButtonDown是直到释放鼠标左键,Grid_PreviewMouseMove就是从来没有开除。

我完全困惑,任何人都可以发现我做错了什么?只是为了理智检查自己,我一直指的是Jaime Rodriquez的Drag & Drop in WPF Explained End to End文章,我清楚地使用了与他相同的技术,那么可能导致这种情况的原因是什么?我真的很希望这只是我错过的一些愚蠢的东西。有任何想法吗?

回答

2

我正在使用Infragistics XamDataGrid来托管需要拖放功能的用户控件。事实证明,当按下鼠标左键时,网格会捕获MouseMove事件。相当恼人。我不知道如何解决或解决它,但至少我知道现在出了什么问题。

相关问题