wpf - 在 TreeView 中拖放,在节点之间插入

标签 wpf drag-and-drop treeview

我正在通过 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 上。

最佳答案

在 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;
    }

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

关于wpf - 在 TreeView 中拖放,在节点之间插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8297384/

相关文章:

wpf - WPF 中的 ListView 和 GridView 有什么区别?

wpf - 需要在动态构建的 WPF DataGrid 中格式化日期

ios - 无法将图像从媒体库拖放到 Xcode Interface Builder 中的 View Controller 上

c# - WPF 树数据绑定(bind)模型和存储库

c# - TreeView 中任何项目的 OnExpanded 事件

wpf - 当焦点来自后面的代码时,如何选择 WPF TextBox 中的所有文本?

c# - 在 WPF 中应用程序启动时应默认选择 ListView 项

java - Swing:创建一个可拖动的组件...?

ios - 如何防止在拖放 TableView 单元格时将数据附加到现有单元格?

java - JFace:带有特定节点复选框的 CheckboxTreeviewer