2009-06-02 9 views
2

私のアプリケーションでドラッグ・ツー・スクロール機能を実現している途中で問題があります。誰か助けてくれますか? 私はScrollViewerを持っていて、その中にItemsControlがあり、ItemsTemplateにはUserControlがあります。 ItemsControl内でそのUserControlをドラッグしたいと思います。 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イベントを処理する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 

これにより、アイテムをドラッグしている間にスクロールすることができます。許容範囲を調整して、必要に応じてスムーズにスクロールさせることができます。

関連する問題