WPF拖动滚动无法正常工作

时间:2009-06-02 11:25:46

标签: wpf drag-and-drop scroll itemscontrol

我想在我的应用程序中实现拖动滚动功能,并且在我的路上遇到问题。有谁能够帮我? 我有一个ScrollViewer,里面有一个ItemsControl,在ItemsTemplate中我有一个UserControl。我想在ItemsControl中拖动UserControl。当我拖动到ItemsControl的边界时,我希望ScrollViewer向下滚动。

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

1 个答案:

答案 0 :(得分:3)

使用DragDrop.DoDragDrop()时,我使用Sub处理Me.DragOver事件(在VB中),因此它看起来如下所示。请注意,我的控件有一个包含在ScrollViewer中的ListBox。

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

这使我能够在拖动项目时滚动。您可以根据需要调整公差以获得更好/更顺畅的滚动。