【问题标题】:WPF Drag-to-scroll doesn't work correctlyWPF 拖动滚动无法正常工作
【发布时间】:2009-06-02 11:25:46
【问题描述】:

我正在尝试在我的应用程序中实现拖动滚动功能,但在途中遇到了问题。有谁能够帮我? 我有一个 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 会根据鼠标位置向下滚动。 也许有一些关于拖动和捕获鼠标的事情我没有考虑到? 感谢关注。 加雷金

【问题讨论】:

    标签: wpf drag-and-drop scroll itemscontrol


    【解决方案1】:

    当使用 DragDrop.DoDragDrop() 时,我使用了一个处理 Me.DragOver 事件的 Sub(在 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 2011-01-28
      • 2018-08-09
      相关资源
      最近更新 更多