WPF перетаскивание для прокрутки работает неправильно

StackOverflow https://stackoverflow.com/questions/938989

Вопрос

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

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 прокручивается вниз в зависимости от положения мыши.Может быть, я что-то не учитываю при перетаскивании и захвате мыши?Спасибо за внимание.Гарегин

Это было полезно?

Решение

При использовании 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top