【问题标题】:(VB.NET + WPF) Drag + Drop (to allow user sorting) of stackpanel elements within a Scrollviewer?(VB.NET + WPF)在Scrollviewer中拖放(允许用户排序​​)stackpanel元素?
【发布时间】:2010-01-08 16:25:13
【问题描述】:

我有一个很好的模型(我认为!)关于如何允许用户拖动堆栈面板中的元素并将其重新定位到堆栈面板中的另一个位置。

但是,我的 Stackpanel 被放置在 ScrollViewer 中,如下所示(通用):

<ScrollViewer>
   <StackPanel>
        ....First item
        ....Second item
        ....Third item
        ....Etc.
    </StackPanel>
<ScrollViewer>

这就是问题所在,我想模拟像word这样的程序的功能,如果我将选定的内容(或对象)拖到可视区域之外,窗口将向鼠标方向滚动以查看更多地方扔掉我漂亮的小物件。

...即如果我在拖动堆栈面板的内容时将鼠标移动到 ScrollViewer 的顶部,我希望 scrollviewer 慢慢向上移动,以便我可以看到更多位置来放置我的内容。

有什么建议吗?

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

【问题讨论】:

    标签: wpf vb.net drag-and-drop scrollviewer stackpanel


    【解决方案1】:

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

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

    DragOver 事件频繁出现,因此每次调用LineUp()LineDown() 时将DateTime.Now 的值保存在字段中。在再次致电之前,请检查DateTime.Now,如果没有足够的时间,请不要致电LineUp()LineDown()

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

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

    【讨论】:

    • 太棒了,我明天第一件事就试一试。搬家是一件令人费解的事情,尽管它肯定会走到一起。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多