示例#1
0
        private void OnDragOver(object sender, DragEventArgs e)
        {
            //Debug.WriteLine("OnDragOver. IsReordering: {0}", isReordering);
            if (!isReordering || draggingItemIndex_original == -1)
            {
                return;
            }
            e.Handled = true;

            //Get the list of items under the current position
            var position     = e.GetPosition(null);
            var hitContainer = VisualTreeHelper
                               .FindElementsInHostCoordinates(position, this, false)
                               .OfType <SelectorItem>()
                               .Where(x => x != Children[draggingItemIndex_original])
                               .FirstOrDefault();

            int newDropAtIndex = (hitContainer == null)
                            ? -1
                            : ParentListView.IndexFromContainer(hitContainer);//elements.IndexOf(hitContainers[0]);

            if (newDropAtIndex == draggingItemIndex_original)
            {
                return;
            }

            //prevent mess: disable reorder on same position (prevent infinite reordering)
            if (lastDragOverPosition != null)
            {
                hitContainer = VisualTreeHelper
                               .FindElementsInHostCoordinates((Point)lastDragOverPosition, this, false)
                               .OfType <SelectorItem>()
                               .Where(x => x != Children[draggingItemIndex_original])
                               .FirstOrDefault();

                var index = (hitContainer == null)
                                ? -1
                                : ParentListView.IndexFromContainer(hitContainer);

                if (index == newDropAtIndex)
                {
                    return;
                }
                lastDragOverPosition = null;
            }

            if (newDropAtIndex < 0)
            {
                return;
            }

            lastDragOverPosition = position;
            dropAtIndex_elements = elements.IndexOf(Children[newDropAtIndex]);
            //Debug.WriteLine("OnDragOver. Drag: {0}, Drop: {1}, OldDrop: {2}", draggingItemIndex_original, dropAtIndex_elements, dropAtIndex_original);
            dropAtIndex_original = newDropAtIndex;

#if WINDOWS_UWP
            e.AcceptedOperation = Windows.ApplicationModel.DataTransfer.DataPackageOperation.Move;
#endif
            InvalidateMeasure();
        }