2009-06-02 73 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 

這使我能夠在拖動項目的同時進行滾動。您可以根據需要調整容差以獲得更好/更平滑的滾動。