2009-06-02 3 views
2

Я привязываюсь к реализации функции перетаскивания в прокрутку в своем приложении и имею проблемы на своем пути. Кто-нибудь может мне помочь? У меня есть ScrollViewer и внутри него ItemsControl и в ItemsTemplate у меня есть UserControl. Я хочу перетащить этот UserControl в ItemsControl. Я хочу, чтобы ScrollViewer прокручивался вниз, когда я перетаскиваю до границ ItemsControl.WPF Drag-to-scroll работает неправильно

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() я использую Sub, который обрабатывает событие Me.DragOver (в VB), поэтому он выглядит следующим образом. Имейте в виду, мой элемент управления имеет ListBox, завернутый в 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 

Это дает мне возможность прокручивать и перетаскивать предметы. Вы можете настроить допуски, чтобы улучшить/сгладить прокрутку по мере необходимости.