我在这里使用 Bea 的解决方案已经有一段时间了,发现它很有帮助。现在我遇到的问题是,当我在另一个 ListView 控件内或向另一个 ListView 控件拖放项目并且我想在拖动“期间”向上/向下滚动(将项目从索引 30 移动到索引 1)时,它没有发生。我将不得不拖动到 ListView 中可视项目的顶部,手动向上滚动,然后再次拖动,最终在我想要的位置结束。这不是很用户友好。
现在我找到了我想要测试哪个项目被拖过的函数(DragDropHelper.DropTarget_PreviewDragOver),我明白了。
Dim pt As Point = e.GetPosition(DirectCast(Me.targetItemsControl, UIElement))
' Perform the hit test against a given portion of the visual object tree.
Dim result As HitTestResult = VisualTreeHelper.HitTest(Me.targetItemsControl, pt)
现在从那里我可以得到这个视觉命中的 DependencyProperty
Dim lvi As ListViewItem = TryCast(GetDependencyObjectFromVisualTree(TryCast(result.VisualHit, DependencyObject), GetType(ListViewItem)), ListViewItem)
这是一个ListViewItem。现在,在函数 DropTarget_PreviewDragOver 中,我有一个“DraggedItem”,它在 Bea 的示例中属于 Picture 类型,但这可能会根据您绑定到 ListView 的 ObservableCollection 而改变。现在,我想根据鼠标在控件上的位置向上或向下拖动 ListView。我尝试使用以下未完成的非工作代码
If lvi IsNot Nothing Then
If pt.Y <= 25 Then
Dim lv As ListView = TryCast(targetItemsControl, ListView)
If lv IsNot Nothing Then
Dim index As Integer = lv.Items.IndexOf(lvi)
If index > 1 Then
lv.ScrollIntoView(lv.Items(index - 1))
End If
End If
Else
If pt.Y >= Me.targetItemsControl.ActualHeight - 25 Then
Debug.Print("Scroll Down")
End If
End If
End If
有人可以指出我在拖动项目时让这个 ItemsControl 或 ListView 滚动的正确方向吗?
谢谢!