示例#1
0
        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();
        }
示例#2
0
        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);
            }
        }
示例#3
0
        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);
        }