private static void ItemsControl_PreviewMouseMove(object sender, System.Windows.Input.MouseEventArgs e) { if (sender is ItemsControl itemsControl) { DragStatusEnum dragStatus = GetDragStatus(itemsControl); switch (dragStatus) { case DragStatusEnum.None: break; case DragStatusEnum.Begining: { if (e.LeftButton == System.Windows.Input.MouseButtonState.Pressed) { Vector vector = e.GetPosition(itemsControl) - mouseDownPoint; if (vector.X > dragBeginedOffset || vector.Y > dragBeginedOffset) { SetDragStatus(itemsControl, DragStatusEnum.Draging); if (dragInfo.ItemContainer is FrameworkElement frameworkElement) { frameworkElement.CaptureMouse(); if (dragAdorner != null) { dragAdorner.Detath(); } Point offset = e.GetPosition(frameworkElement); dragAdorner = new DragAdorner(itemsControl, frameworkElement, new Point() { X = -offset.X, Y = -offset.Y }); } } } } break; case DragStatusEnum.Draging: { if (e.LeftButton == System.Windows.Input.MouseButtonState.Pressed) { if (dragAdorner != null) { dragAdorner.UpdatePoint(e.GetPosition(itemsControl)); } if (GetItem(itemsControl.ItemContainerGenerator, itemsControl.InputHitTest(e.GetPosition(itemsControl)), out DependencyObject itemContainer, out object item)) { if (/*itemContainer != dragInfo.ItemContainer && */ itemContainer is FrameworkElement frameworkElement) { if (lineAdorner == null) { lineAdorner = new LineAdorner(itemsControl); lineAdorner.UpdateBrush(GetDropTargetLineBrush(itemsControl), GetDropTargetLineThickness(itemsControl)); lineAdorner.UpdateTarget(e.MouseDevice, frameworkElement, GetItemPanelOrientation(itemsControl)); } else { lineAdorner.UpdateTarget(e.MouseDevice, frameworkElement, GetItemPanelOrientation(itemsControl)); } } } else { if (lineAdorner != null) { lineAdorner.ClearTarget(); } } e.Handled = true; } } break;