0

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

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

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

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

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

有什么建议么?

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

4

1 回答 1

0

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

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

事件DragOver频繁出现,因此DateTime.Now每次调用LineUp()或时将 的值保存在字段中LineDown()。在再次打电话给他们之前,检查一下DateTime.Now,如果没有足够的时间过去,不要打电话LineUp()LineDown()

为了更好地控制滚动速度,您可以使用和scrollViewer.ScrollToVerticalOffset(scrollViewer.ContentVerticalOffset + delta)代替。scrollViewer.LineUp()scrollViewer.LineDown()

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

于 2010-01-08T19:59:36.290 回答