2009-06-02 40 views
2

我正在绑定实现我的应用程序中的拖动滚动功能,并在我的方式有问题。有谁能够帮助我? 我有一个ScrollViewer,里面有一个ItemsControl和ItemsTemplate内我有一个UserControl。我想在ItemsControl中拖动该用户控件。当我拖动到ItemsControl的边界时,我想让ScrollViewer向下滚动。WPF拖动滚动不能正常工作

protected override void OnPreviewMouseMove(System.Windows.Input.MouseEventArgs e) 
{ 
    if (this.IsMouseCaptured) 
    { 
     // Get the new mouse position. 
     Point mouseDragCurrentPoint = e.GetPosition(this); 

     if (Math.Abs(mouseDragCurrentPoint.Y - this.ActualHeight) <= 50) 
     { 
      this._scrollStartOffset.Y += 5; 
      _containingScrollViewer.ScrollToVerticalOffset(this._scrollStartOffset.Y); 
     } 
     if (mouseDragCurrentPoint.Y <= 50) 
     { 
      this._scrollStartOffset.Y -= 5; 
      _containingScrollViewer.ScrollToVerticalOffset(this._scrollStartOffset.Y); 
     } 
    } 
    base.OnPreviewMouseMove(e); 
} 

当我开始拖动通过调用DragDrop.DoDragDrop()滚动不会发生。但是,当我禁用拖动时,ScrollViewer会向下滚动鼠标位置上的位置。 也许有些东西我没有考虑拖动和捕捉鼠标? 感谢您的关注。 Garegin

回答

3

当使用DragDrop.DoDragDrop()时,我使用处理Me.DragOver事件(在VB中)的Sub,因此它看起来如下所示。请注意,我的控件有一个包装在ScrollViewer中的ListBox。

Private Sub ListBox_Items_DragOver(ByVal sender As System.Object, ByVal e As System.Windows.DragEventArgs) Handles Me.DragOver 
     Dim currentMousePoint As Point = e.GetPosition(_containtingScrollViewer) 
     If Math.Abs(currentMousePoint.Y - _containtingScrollViewer.ActualHeight) <= 50 Then 
      _containtingScrollViewer.ScrollToVerticalOffset(currentMousePoint.Y + 5) 
     End If 
     If currentMousePoint.Y <= 50 Then 
      _containtingScrollViewer.ScrollToVerticalOffset(currentMousePoint.Y - 5) 
     End If 
End Sub 

这使我能够在拖动项目的同时进行滚动。您可以根据需要调整容差以获得更好/更平滑的滚动。