2010-01-08 44 views
0

我有一个很好的模型(我想!)如何让用户在堆栈面板中拖动元素并将其重新定位到堆栈面板中的另一个位置。(VB.NET + WPF)在滚动查看器中拖放(允许用户排序​​)堆栈面板元素?

然而,我的StackPanel被放置在的ScrollViewer内,像这样的(广义):

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

这是问题所在,我希望模拟像的话,在那里,如果我拖动选择的内容节目的功能(或对象)在可视区域外,窗口将按鼠标方向滚动以查看更多地方放弃我漂亮的小物体。

......即,如果将鼠标移动到我的ScrollViewer的顶部,同时拖动一个堆叠面板的内容,我希望滚动查看器缓慢向上移动,这样我可以看到更多位置放置我的内容。

有什么建议吗?

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

回答

0

没问题。在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()

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

+0

太棒了,明天我会先试一试。移动是一种思维导向,尽管它肯定会聚到一起。谢谢! – 2010-01-08 20:44:46