【问题标题】:Drag-Drop in treeview, insert between nodes在树视图中拖放,在节点之间插入
【发布时间】:2012-01-08 00:04:26
【问题描述】:

我正在通过 XmlDataProvider 填充 TreeView,并且已经实现了拖放功能,因此我可以四处移动节点,并从其他位置删除节点。

但是我只实现了最简单的形式;当您放置时,它会作为子节点插入到放置它的节点中。此功能按预期工作。但我也希望能够在两个节点之间放置一个项目,以便它成为兄弟节点。

我应该如何着手解决这个问题?

目前我正在使用带有 StackPanel 的 HierarchicalDataTemplate:

<HierarchicalDataTemplate x:Key="XmlTreeTemplate">
   <HierarchicalDataTemplate.ItemsSource>
     <Binding XPath="child::node()" />
   </HierarchicalDataTemplate.ItemsSource>
   <StackPanel
      AllowDrop="True"
      DragEnter="StackPanelDragEnter"
      DragLeave="StackPanelDragLeave"
      DragOver="StackPanelDragOver"
      ...

Drop 事件在 TreeView 上。

【问题讨论】:

    标签: wpf drag-and-drop treeview


    【解决方案1】:

    在 DragOver 期间,您可以使用此方法确定您的鼠标位置是高于还是低于 TreeView 节点:

        public static bool IsInFirstHalf(FrameworkElement container, Point mousePosition, Orientation orientation)
        {
            if (orientation == Orientation.Vertical)
            {
                return mousePosition.Y < container.ActualHeight / 2;
            }
            return mousePosition.X < container.ActualWidth / 2;
        }
    

    然后在您的节点之前/之后显示一个插入装饰器。 On Drop 在被删除的节点之前(父节点的子节点)或之后(兄弟节点)创建一个新节点。

    【讨论】:

    • 谢谢,成功了!那我应该怎么做一个吊饰呢?
    • 很高兴我能帮上忙。看看那里的许多教程。就我而言,我制作了一个自定义装饰器,每端有一条线和两个矩形。该装饰器在拖拽期间显示在 TreeNode 之前 (TOP) 或之后 (TOP + HEIGHT)。
    • 如果您的节点已展开并且有子节点,这将无法正常工作。无论节点上的哪个位置发生丢弃,它都将始终返回 true。相反,使用固定值 mousePosition.Y
    猜你喜欢
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多