Перетаскивание в WPF не работает правильно - PullRequest
2 голосов
/ 02 июня 2009

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

1 Ответ

3 голосов
/ 07 октября 2009

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

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

...