【问题标题】:WPF: How to implement Drag and Drop with nested (hierarchical) controlsWPF:如何使用嵌套(分层)控件实现拖放
【发布时间】:2009-02-20 22:01:51
【问题描述】:

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

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

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

我的代码可以成功地完成其中之一,但我不知道如何同时做到这一点。

似乎有某种痛苦的解决方案会涉及命中测试以及嵌套列表的 z 顺序,但我找不到任何示例。

有人可以指点一下吗?

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

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

【问题讨论】:

    标签: .net wpf silverlight


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 好主意...我认为这会使实现拖放功能变得更简单...但它会给我带来一些新的 UI 外观和感觉挑战...
    【解决方案3】:

    AllowDrop 在任何控件上都必须为真。

    【讨论】:

      【解决方案4】:

      在使用包含嵌套用户控件的列表框的应用程序时,我遇到了类似的问题。
      我在每个控制级别的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  
      

      因此,由于clickChild's ListBox 内,因此事件会冒泡到通过DragEvent 条件的最低处理程序。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-03
        • 1970-01-01
        • 2014-04-27
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 2021-09-13
        相关资源
        最近更新 更多