private static DropItemLocationAdorner GetAdorner(IDragDropFeedback feedback, FrameworkElement draggedOverElement, bool createIfNeeded) { var dragDropFeedback = (DragDropFeedback)feedback; DropItemLocationAdorner adorner = (dragDropFeedback != null) ? dragDropFeedback.Adorner : null; if (adorner == null) { var adornedElement = GetRootItemsControl(draggedOverElement); if ((adornedElement != null) && DragDropRearrangeBehavior.GetAllowsDragDropRearrange(adornedElement)) { if ((adorner == null) && createIfNeeded) { adorner = new DropItemLocationAdorner(adornedElement, draggedOverElement); dragDropFeedback.Adorner = adorner; } } } else if ((draggedOverElement != adorner.AdornedItemsControl) && (draggedOverElement.GetParent <ItemsControl>(i => i == adorner.AdornedItemsControl) == null)) { if (dragDropFeedback != null) { dragDropFeedback.DropLocation = DropOnItemLocation.None; } } return(adorner); }
/// <summary> /// Update the adorner's location, etc. /// </summary> /// <param name="draggedOverElement">The item being dragged over.</param> /// <param name="dragDropFeedback">Feedback interface.</param> /// <param name="exitDragDrop">If <c>true</c>, we're doing a drag-drop exit.</param> public static void Update(FrameworkElement draggedOverElement, IDragDropFeedback dragDropFeedback, bool exitDragDrop) { var ending = (dragDropFeedback == null) || (dragDropFeedback.DropLocation == DropOnItemLocation.None); var adorner = GetAdorner(dragDropFeedback, draggedOverElement, !ending); // may modify the feedback ending = (dragDropFeedback == null) || (dragDropFeedback.DropLocation == DropOnItemLocation.None); if (ending || exitDragDrop) { if (adorner != null) { adorner.Remove(dragDropFeedback, exitDragDrop); } } else { if ((adorner != null) && (draggedOverElement != adorner.AdornedElement)) { if (adorner.Layer == null) { adorner.Layer = AdornerLayer.GetAdornerLayer(adorner.AdornedElement); adorner.Layer.Add(adorner); } // fix up size / position adorner.SuspendUpdates = true; adorner.DragOverElement = draggedOverElement; adorner.DropLocation = dragDropFeedback.DropLocation; adorner.AllowsChildren = dragDropFeedback.AllowsChildren; adorner.SuspendUpdates = false; } } }
private void Remove(IDragDropFeedback feedback, bool exitDragDrop) { if (Layer != null) { Layer.Remove(this); Layer = null; if (exitDragDrop) { ((DragDropFeedback)feedback).Adorner = null; } } SuspendUpdates = true; DragOverElement = null; DropLocation = DropOnItemLocation.None; SomethingChanged = false; AllowsChildren = false; }
private static void HandleDragOver(object sender, DragEventArgs args) { var visual = sender as FrameworkElement; IDragDropFeedback dragDropFeedback = null; if (args.Data.GetDataPresent(DragDropHelpers.DragDropFeedbackDataFormat)) { dragDropFeedback = args.Data.GetData(DragDropHelpers.DragDropFeedbackDataFormat) as IDragDropFeedback; } else { var itemsControl = visual as System.Windows.Controls.ItemsControl; var allowsRearrange = (itemsControl != null) && DragDropRearrangeBehavior.GetAllowsDragDropRearrange(itemsControl); if (allowsRearrange) { dragDropFeedback = new DragDropFeedback(); args.Data.SetData(DragDropHelpers.DragDropFeedbackDataFormat, dragDropFeedback); } } if (dragDropFeedback != null) { var height = visual.ActualHeight; var location = args.GetPosition(visual); var dropLocation = GetDropLocation(visual, location); dragDropFeedback.DropLocation = dropLocation; } GetDragOverCommand(visual).Execute(args); if (dragDropFeedback != null) { if (args.Effects == DragDropEffects.None) { dragDropFeedback.DropLocation = DropOnItemLocation.None; } DropItemLocationAdorner.Update(visual, dragDropFeedback, false); } args.Handled = true; }