2009-06-02 10 views
2

Ich bin verpflichtet, eine Drag-to-Scroll-Funktionalität in meiner Anwendung zu realisieren und habe Probleme auf dem Weg. Kann mir jemand helfen? Ich habe einen ScrollViewer und darin ein ItemsControl und in ItemsTemplate habe ich ein UserControl. Ich möchte dieses UserControl in ItemsControl ziehen. Ich möchte, dass der ScrollViewer nach unten scrollt, wenn ich an die Grenzen von ItemsControl ziehe.WPF Drag-to-Scroll funktioniert nicht richtig

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); 
} 

Wenn ich durch den Aufruf DragDrop.DoDragDrop() Scrollen starten Ziehen Sie geschieht nicht. Aber wenn ich das Ziehen deaktiviere, scrollt der ScrollViewer abhängig von der Mausposition nach unten. Vielleicht gibt es etwas, was ich nicht über das Ziehen und Erfassen der Maus verstehe? Danke für die Aufmerksamkeit. Garegin

Antwort

3

Wenn ich DragDrop.DoDragDrop() verwende, verwende ich ein Sub, das das Me.DragOver-Ereignis behandelt (in VB), so sieht es wie folgt aus. Wohlgemerkt, meine Steuerung hat eine ListBox in einem ScrollViewer.

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 

Dies gibt mir die Möglichkeit zum Scrollen beim Ziehen von Elementen. Sie können die Toleranzen anpassen, um bei Bedarf ein besseres/weicheres Scrollen zu erhalten.