(VB.NET+;WPF)拖动+;是否在Scrollviewer中放置(允许用户排序)stackpanel元素?

(VB.NET+;WPF)拖动+;是否在Scrollviewer中放置(允许用户排序)stackpanel元素?,wpf,vb.net,drag-and-drop,scrollviewer,stackpanel,Wpf,Vb.net,Drag And Drop,Scrollviewer,Stackpanel,对于如何允许用户在stackpanel中拖动元素并将其重新定位到stackpanel中的另一个位置,我有一个很好的模型(我想!) 但是,我的Stackpanel位于ScrollViewer中,如下所示(通用): ……第一项 ……第二项 ……第三项 等 问题是,我希望模拟word等程序的功能,如果我将选定内容(或对象)拖到可视区域之外,窗口将朝鼠标方向滚动,以看到更多放置我漂亮小对象的位置 …即。如果在拖动stackpanel的内容时将鼠标移动到ScrollViewer的顶部,我希望Scrol

对于如何允许用户在stackpanel中拖动元素并将其重新定位到stackpanel中的另一个位置,我有一个很好的模型(我想!)

但是,我的Stackpanel位于ScrollViewer中,如下所示(通用):


……第一项
……第二项
……第三项
等
问题是,我希望模拟word等程序的功能,如果我将选定内容(或对象)拖到可视区域之外,窗口将朝鼠标方向滚动,以看到更多放置我漂亮小对象的位置

…即。如果在拖动stackpanel的内容时将鼠标移动到ScrollViewer的顶部,我希望ScrollViewer缓慢向上移动,以便可以看到更多放置内容的位置

有什么建议吗


如果你能帮我解决这个问题,你将是天赐之物

没问题。在
ScrollViewer
级别处理
DragOver
路由事件。得到这个职位。如果它接近ScrollViewer边界的顶部,则向上滚动。如果它接近ScrollViewer边界的底部,则向下滚动

滚动本身是通过调用
scrollViewer.LineUp()
scrollViewer.LineDown()
完成的

DragOver
事件经常发生,因此请保存
DateTime的值。现在,每次调用
LineUp()
LineDown()
时,都将
保存在一个字段中。在再次调用它们之前,请检查
DateTime。现在
如果没有足够的时间,请不要调用
LineUp()
LineDown()

为了更好地控制滚动速度,您可以使用
scrollViewer.ScrollToVerticalOffset(scrollViewer.ContentVerticalOffset+delta)
而不是
scrollViewer.LineUp()
scrollViewer.LineDown()


如果在接近滚动查看器的顶部或底部时允许快速滚动,则可以提供更好的用户体验。这可以通过将滚动区域划分为多个区域,或者从鼠标位置计算速度来实现。在这种情况下,可以在靠近边缘时多次调用
LineUp()/LineDown()
,或者在使用
ScrollToVerticalOffset
时增加
delta
值来更改速度。您可能不应该为此修改计时(DateTime.Now comparison),因为它不可靠。

太棒了,明天我将首先尝试一下。搬家是一件让人心烦意乱的事,尽管它肯定会走到一起。谢谢
<ScrollViewer>
   <StackPanel>
        ....First item
        ....Second item
        ....Third item
        ....Etc.
    </StackPanel>
<ScrollViewer>