2009-06-02 24 views
2

Je suis impatient de réaliser une fonctionnalité glisser-défiler dans mon application et avoir des problèmes sur mon chemin. Quelqu'un peut-il m'aider? J'ai un ScrollViewer et à l'intérieur un ItemsControl et dans ItemsTemplate j'ai un UserControl. Je veux faire glisser ce UserControl dans ItemsControl. Je veux que ScrollViewer défile vers le bas, lorsque je suis en train de glisser vers les limites de ItemsControl.WPF Drag-to-Scroll ne fonctionne pas correctement

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

Quand je commence à glisser en appelant DragDrop.DoDragDrop() le défilement se font pas. Mais quand je désactive le glissement, le ScrollViewer défile en fonction de la position de la souris. Peut-être y at-il quelque chose que je ne prends pas en compte pour faire glisser et capturer la souris? Merci de votre attention. Garegin

Répondre

3

Lors de l'utilisation de DragDrop.DoDragDrop(), j'utilise un Sub qui gère l'événement Me.DragOver (dans VB) afin qu'il ressemble à ce qui suit. Rappelez-vous, mon contrôle a un ListBox enveloppé dans un 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 

Cela me permet de faire défiler tout en faisant glisser des éléments. Vous pouvez modifier les tolérances pour obtenir un défilement meilleur/plus lisse au besoin.