void OnDrop(object sender, DragEventArgs e) { e.Handled = true; TreeViewExItem item = GetTreeViewItemUnderMouse(e.GetPosition(TreeView)); //if (item == null) //{ // CleanUpAdorners(); // return; //} CanInsertReturn canInsertReturn = CanInsert(item, e.GetPosition, e.Data); if (canInsertReturn != null) { // insert and return TreeView.DropCommand.Execute(new DropParameters(item.ParentTreeViewItem, e.Data, canInsertReturn.Index)); CleanUpAdorners(); return; } // check if drop is possible if (CanDrop(item, e.Data)) { // drop and return TreeView.DropCommand.Execute(new DropParameters(item, e.Data)); } DragEnd(); }
void OnDragOver(object sender, DragEventArgs e) { e.Effects = DragDropEffects.None; e.Handled = true; // drag over is the only event which returns the position Point point = e.GetPosition(TreeView); if (TryScroll(point)) { return; } if (IsMouseOverAdorner(point)) { return; } var itemsPresenter = TreeView.ScrollViewer.Content as ItemsPresenter; /* * if (itemsPresenter.InputHitTest(e.GetPosition(itemsPresenter)) == null) * { * if (insertAdorner != null) insertAdorner.Dispose(); * return; * } */ if (_ItemMouseIsOver != null) { _ItemMouseIsOver.IsCurrentDropTarget = false; } _ItemMouseIsOver = GetTreeViewItemUnderMouse(point); //if (itemMouseIsOver == null) return; CanInsertReturn canInsertReturn = CanInsert(_ItemMouseIsOver, e.GetPosition, e.Data); if (canInsertReturn != null) { e.Effects = DragDropEffects.Move; if (_InsertAdorner == null) { _InsertAdorner = new InsertAdorner(_ItemMouseIsOver, new InsertContent { Before = canInsertReturn.Before }); } else { _InsertAdorner.Dispose(); _InsertAdorner = new InsertAdorner(_ItemMouseIsOver, new InsertContent { Before = canInsertReturn.Before }); } _ItemMouseIsOver.IsCurrentDropTarget = false; } else { if (_InsertAdorner != null) { _InsertAdorner.Dispose(); _InsertAdorner = null; } if (CanDrop(_ItemMouseIsOver, e.Data)) { e.Effects = DragDropEffects.Move; if (_ItemMouseIsOver != null) { _ItemMouseIsOver.IsCurrentDropTarget = true; } } } }