/// <summary> /// Event for Drag Drop of a project node. /// </summary> /// <param name="sender">Sending object.</param> /// <param name="e">Drag event args.</param> private void ProjectExplorerTreeViewDragDrop(Object sender, DragEventArgs e) { // Retrieve the client coordinates of the drop location. Point targetPoint = this.projectExplorerTreeView.PointToClient(new Point(e.X, e.Y)); // Retrieve the node at the drop location. TreeNodeAdv targetNodeAdv = this.projectExplorerTreeView.GetNodeAt(targetPoint); // Retrieve the node that was dragged. TreeNodeAdv[] draggedNodesAdv = e.Data.GetData(typeof(TreeNodeAdv[])) as TreeNodeAdv[]; if (draggedNodesAdv.Count() <= 0) { return; } TreeNodeAdv draggedNodeAdv = draggedNodesAdv[0]; if (draggedNodeAdv != null && targetNodeAdv != null && draggedNodeAdv != targetNodeAdv) { ProjectRoot projectRoot = this.ProjectExplorerViewModel.ProjectRoot; ProjectItem draggedItem = this.GetProjectItemFromNode(draggedNodeAdv); ProjectItem targetItem = this.GetProjectItemFromNode(targetNodeAdv); projectRoot?.BuildParents(); if (!(draggedItem is FolderItem) || !(draggedItem as FolderItem).HasNode(targetItem)) { switch (this.projectExplorerTreeView.DropPosition.Position) { case NodePosition.Before: projectRoot.RemoveNode(draggedItem); targetItem.Parent?.AddSibling(targetItem, draggedItem, after: false); break; case NodePosition.Inside: if (targetItem is FolderItem) { projectRoot.RemoveNode(draggedItem); (targetItem as FolderItem).AddChild(draggedItem); } break; case NodePosition.After: projectRoot.RemoveNode(draggedItem); targetItem.Parent?.AddSibling(targetItem, draggedItem, after: true); break; } } this.UpdateStructure(this.ProjectExplorerViewModel.ProjectRoot); } }