(VB.NET+;WPF)拖动+;是否在Scrollviewer中放置(允许用户排序)stackpanel元素?
对于如何允许用户在stackpanel中拖动元素并将其重新定位到stackpanel中的另一个位置,我有一个很好的模型(我想!) 但是,我的Stackpanel位于ScrollViewer中,如下所示(通用):(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
……第一项
……第二项
……第三项
等
问题是,我希望模拟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>