使用WPF我已成功实现拖放以重新排列列表(视图或框)中的项目,并在列表之间拖放项目。
现在我正在尝试弄清楚如何使用NESTED列表实现拖放。
例如,我有一个包含项目的列表视图,每个项目项包含另一个任务列表视图。我希望能够拖放以重新排列项目的顺序,并重新排序任务并在项目之间移动它们。
我的代码成功地执行了另一个代码,但我无法弄清楚如何做到这两个。
似乎有某种痛苦的解决方案涉及命中测试,也许是嵌套列表的z顺序,但我找不到任何这样的例子。
任何人都可以提供任何指示吗?
仅供参考:我目前实施的工作代码基于以下两篇关于WPF拖放的优秀文章:
http://bea.stollnitz.com/blog/?p=53 http://www.codeproject.com/KB/WPF/ListViewDragDropManager.aspx
答案 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
条件的最低处理程序。
希望这有帮助!