internal DragStartingContext InitializeReorder() { var dragVisual = this.ListView.DragBehavior.GetReorderVisual(this); if (dragVisual == null) { this.dragVisual = this.ListView.GetContainerForItem(); this.dragVisual.Orientation = this.Orientation; this.dragVisual.Width = this.ActualWidth; this.dragVisual.Height = this.ActualHeight; this.dragVisual.ListView = this.ListView; this.dragVisual.isDragContent = true; this.dragVisual.IsSelected = this.IsSelected; this.ListView.PrepareContainerForItem(this.dragVisual, this.DataContext); } (dragVisual as IDragDropElement).SkipHitTest = true; DragDrop.SetDragPositionMode(this, this.ListView.Orientation == Orientation.Vertical ? DragPositionMode.RailY : DragPositionMode.RailX); this.Opacity = 0.0; var surface = new CanvasDragSurface(this.ListView.childrenPanel as FrameworkElement, this.ListView.childrenPanel as Canvas, true); var payload = new ReorderItemsDragOperation(this, this.DataContext); this.ListView.DragBehavior.OnReorderStarted(this.DataContext); return(new DragStartingContext { DragVisual = dragVisual, Payload = payload, DragSurface = surface, HitTestStrategy = new ReorderListViewItemHitTestStrategy(this, surface.RootElement) }); }
DragStartingContext IDragDropElement.DragStarting(DragDropTrigger trigger, object initializeContext) { this.ListView.CleanupSwipedItem(); DragStartingContext context = null; var dataItem = this.DataContext; if (dataItem != null) { bool isExecuted = false; DragAction?dragAction = null; if (trigger == DragDropTrigger.Drag && (!this.isHandleEnabled || initializeContext != this.reorderHandle)) { if (this.ListView.LayoutDefinition is StackLayoutDefinition) { if (this.Owner.Orientation == Orientation.Horizontal) { if (this.SwipeDirection == ListViewItemSwipeDirection.Forward) { DragDrop.SetDragPositionMode(this, DragPositionMode.RailYForward); } else if (this.SwipeDirection == ListViewItemSwipeDirection.Backwards) { DragDrop.SetDragPositionMode(this, DragPositionMode.RailYBackwards); } else if (this.SwipeDirection == ListViewItemSwipeDirection.All) { DragDrop.SetDragPositionMode(this, DragPositionMode.RailY); } } else { if (this.SwipeDirection == ListViewItemSwipeDirection.Forward) { DragDrop.SetDragPositionMode(this, DragPositionMode.RailXForward); } else if (this.SwipeDirection == ListViewItemSwipeDirection.Backwards) { DragDrop.SetDragPositionMode(this, DragPositionMode.RailXBackwards); } else if (this.SwipeDirection == ListViewItemSwipeDirection.All) { DragDrop.SetDragPositionMode(this, DragPositionMode.RailX); } } isExecuted = this.ListView.commandService.ExecuteCommand(CommandId.ItemDragStarting, new ItemDragStartingContext(dataItem, DragAction.ItemAction, this)); dragAction = DragAction.ItemAction; } } else { isExecuted = this.ListView.commandService.ExecuteCommand(CommandId.ItemDragStarting, new ItemDragStartingContext(dataItem, DragAction.Reorder, this)); dragAction = DragAction.Reorder; } if (isExecuted && dragAction.HasValue) { this.PrepareDragVisual(dragAction.Value); this.CancelDirectManipulations(); if (dragAction.Value == DragAction.Reorder) { context = this.InitializeReorder(); } else if (dragAction.Value == DragAction.ItemAction) { // We might need to cancel manipulations on the dragvisual //// this.dragVisual.CancelDirectManipulations(); this.UpdateActionContentClipping(0); CanvasDragSurface dragSurface = new CanvasDragSurface(this.ListView.childrenPanel, this.ListView.childrenPanel as Canvas, false); dragSurface.MaxPositionOffset = this.listView.ItemSwipeOffset; context = new DragStartingContext { DragSurface = dragSurface, DragVisual = this.dragVisual, HitTestStrategy = new ListViewItemHittestStrategy(this, this), Payload = DragAction.ItemAction }; } } } return(context); }