Перетаскивание в виде дерева, вставка между узлами - PullRequest
5 голосов
/ 28 ноября 2011

Я заполняю TreeView через XmlDataProvider и уже реализовал функцию перетаскивания, поэтому я могу перемещать узлы и удалять узлы из других мест.

Но я реализовал только простейшую форму; когда вы отбрасываете, он вставляется как дочерний узел, на который он отбрасывается. Эта функциональность работает как задумано. Но я также хочу иметь возможность бросать элемент между двумя узлами, чтобы он стал братом или сестрой.

Как мне решить эту проблему?

В настоящее время я использую HierarchicalDataTemplate со StackPanel:

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

Событие Drop находится в TreeView.

1 Ответ

5 голосов
/ 28 ноября 2011

Во время 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;
    }

Затем отобразите рекламный указатель вставки до / после вашего узла. При отбрасывании создайте новый узел либо до (дочерний узел родительского узла), либо после (дочерний узел) отброшенного узла.

...