private static void OnGridPreviewDragOver(object sender, DragEventArgs e) { if (_dropData == null) { return; } var adapter = GetSelectorAdapter(sender as Selector); var data = _dropData.GetData(typeof(Data)) as Data; bool sameSelectorTypes = _senderAdapter.GetType() == adapter.GetType(); if (sameSelectorTypes) { var hoveredControl = e.OriginalSource as DependencyObject; // update drag visuals var currentTargetItem = adapter.GetItem(hoveredControl); if (currentTargetItem != null) { showInsertLine(currentTargetItem, e.GetPosition(currentTargetItem).Y < currentTargetItem.ActualHeight / 4); } else { hideInsertLine(); } if (adapter.IsValidDropTarget(hoveredControl)) { e.Effects = (!isCtrlKeyPressed()) ? DragDropEffects.Move : DragDropEffects.Copy; } else { e.Effects = DragDropEffects.None; } } // scroll if necessary ScrollViewer sv = VisualHelpers.FindChild <ScrollViewer>(adapter.Selector); double verticalPos = e.GetPosition(adapter.Selector).Y; double scrollOffset = getDragScrollOffset(adapter); if (verticalPos < DRAG_SCROLL_TOLERANCE) // Top of visible list? { sv.ScrollToVerticalOffset(sv.VerticalOffset - scrollOffset); //Scroll up. } else if (verticalPos > adapter.Selector.ActualHeight - DRAG_SCROLL_TOLERANCE) //Bottom of visible list? { sv.ScrollToVerticalOffset(sv.VerticalOffset + scrollOffset); //Scroll down. } e.Handled = sameSelectorTypes; }