public void Drop(IDropInfo dropInfo) { ProgramToStart sourceItem = dropInfo.Data as ProgramToStart; //dragged item ProgramToStart targetItem = dropInfo.TargetItem as ProgramToStart; //item on with user drops the sourceitem RelativeInsertPosition positionOfItem = dropInfo.InsertPosition; //position (before or after targetItem) int insertIndex = dropInfo.InsertIndex; //positon in ProgramsToStartList where item was dropped //Checking if item was dropped before or after targetItem and moving into correct position in ProgramsToStartList if (positionOfItem == (RelativeInsertPosition.BeforeTargetItem | RelativeInsertPosition.TargetItemCenter)) { ProgramsToStartList.Move(sourceItem.StartingOrder - 1, insertIndex); } else { //Checking if new position is the last in the list - if it is last, put item in the last position //To prevent ArgumentOutOfRange Exception for ProgramsToStartList.Move() if (insertIndex == ProgramsToStartList.Count) { ProgramsToStartList.Move(sourceItem.StartingOrder - 1, insertIndex - 1); } else { ProgramsToStartList.Move(sourceItem.StartingOrder - 1, insertIndex); } } //After source Item was moved to the new position we need to update StartingOrder property of all ProgramsToStart UpdateStartingOrdersInProgramsToStartListView(); //Then we need to refresh the ListView RefreshProgramsToStartListView(); }
public void Drop(IDropInfo dropInfo) { ProgramToStartWrapper sourceItem = dropInfo.Data as ProgramToStartWrapper; //dragged item ProgramToStartWrapper targetItem = dropInfo.TargetItem as ProgramToStartWrapper; //item on with user drops the sourceitem RelativeInsertPosition positionOfItem = dropInfo.InsertPosition; //position (before or after targetItem) int insertIndex = dropInfo.InsertIndex; //positon in ProgramsToStart where item was dropped if (positionOfItem == RelativeInsertPosition.BeforeTargetItem || targetItem.Order >= HandlersManager.StartingProgramsHandler.ProgramsToStart.Count) { HandlersManager.StartingProgramsHandler.TryChangeProgramToStartIndex(sourceItem.Order, targetItem.Order); } else { HandlersManager.StartingProgramsHandler.TryChangeProgramToStartIndex(sourceItem.Order, targetItem.Order + 1); } }
private static void OnListDragOver(object?sender, DragEventArgs e) { var listBox = sender as ListBox; var dropElement = FindVisualParent <ListBoxItem>(e.Source as IVisual); var dragInfo = e.Data.Get("") as DragInfo?; if (dragInfo == null || dragInfo.Value.draggedElement.Count == 0) { return; } if (listBox == null) { return; } var dropHandler = GetDropHandler(listBox); if (dropHandler == null) { return; } var indexOfDrop = listBox.ItemContainerGenerator.IndexFromContainer(dropElement); RelativeInsertPosition insertPosition = RelativeInsertPosition.None; if (dropElement != null) { var rel = e.GetPosition(dropElement).Y / dropElement.Bounds.Height; if (rel < 0.5f) { insertPosition = RelativeInsertPosition.BeforeTargetItem; } else { insertPosition = RelativeInsertPosition.AfterTargetItem; } if (rel >= 0.25f && rel <= 0.75f) { insertPosition |= RelativeInsertPosition.TargetItemCenter; } } else { indexOfDrop = listBox.ItemCount; } var dropInfo = new DropInfo(dragInfo.Value.draggedElement[0] !) { InsertIndex = indexOfDrop, InsertPosition = insertPosition, TargetItem = listBox.Items }; dropHandler.DragOver(dropInfo); { double mousePosY = e.GetPosition(listBox).Y; if (mousePosY < 10) { listBox.Scroll.Offset = listBox.Scroll.Offset + new Vector(0, -1); } else if (mousePosY > listBox.Bounds.Height - 10) { listBox.Scroll.Offset = listBox.Scroll.Offset + new Vector(0, +1); } } adorner.Adorner?.Update(listBox, dropInfo); }