WPF:如何使用嵌套(分层)控件实现拖放

时间:2009-02-20 22:01:52

标签: .net wpf silverlight

使用WPF我已成功实现拖放以重新排列列表(视图或框)中的项目,并在列表之间拖放项目。

现在我正在尝试弄清楚如何使用NESTED列表实现拖放。

例如,我有一个包含项目的列表视图,每个项目项包含另一个任务列表视图。我希望能够拖放以重新排列项目的顺序,并重新排序任务并在项目之间移动它们。

我的代码成功地执行了另一个代码,但我无法弄清楚如何做到这两个。

似乎有某种痛苦的解决方案涉及命中测试,也许是嵌套列表的z顺序,但我找不到任何这样的例子。

任何人都可以提供任何指示吗?

仅供参考:我目前实施的工作代码基于以下两篇关于WPF拖放的优秀文章:

http://bea.stollnitz.com/blog/?p=53 http://www.codeproject.com/KB/WPF/ListViewDragDropManager.aspx

4 个答案:

答案 0 :(得分:4)

由于MouseMove和wpf中的大多数其他人都是路由事件,因此您只需在公共事件处理程序中检查e.OriginalSource即可。然后,您可以根据鼠标所在的元素决定拖动哪个元素,可能使用其中一个“查找满足条件的父级”辅助方法技术。此外,如果订阅事件的可视树中有多个元素,则可以设置e.Handled

答案 1 :(得分:2)

首先想到的是,如果要进行嵌套,为什么不使用TreeView而不是ListView?

答案 2 :(得分:0)

任何控件上的AllowDrop都必须为true。

答案 3 :(得分:0)

在使用嵌套用户控件的列表框处理应用程序时,我遇到了类似的问题 我在每个控件级别的PreviewMouseButtonDown event处理了所有这些。我检查点击的点的坐标。如果它来自父ListBoxItem中不在ListBox中的任何位置,我会在那里处理DragDrop.DoDragDrop()。如果它来自ListBoxItem内部,我会让它向下冒泡到子ListBox的PreviewMouseButtonDown event。我检查孩子ListBox中的位置,看看哪个项目被点击了,这样我就可以抓住它并在这个级别上执行DragDrop

伪代码如下:

Parent ListBox  
--  PListBoxItem1  
--  PListBoxItem2  
--  PListBoxItem3  
----    Child ListBox  
------  Child ListBoxItem1  
------  Child ListBoxItem2  -Click drag started here  
------  Child ListBoxItem3  

代码:

Parent_List_Box_PreviewMouseButtonDown  
If mouse position is not inside the Child ListBox Then  
  DoDragDrop() on the Parent level with this ListBoxItem  
End If

Child_ListBox_PreviewMouseButtonDown  
Determine which item the mouse was clicked on relative to the Child ListBox  
DoDragDrop() on the Child level with this ListBoxItem  

因为click位于Child's ListBox内,所以事件会向下传递到通过DragEvent条件的最低处理程序。

希望这有帮助!