private void AssociateObject_PreviewDragEnter(object sender, DragEventArgs e) { if (AssociatedObject.ItemTemplate != null) { if (_dragVisual == null) { FrameworkElement source = sender as FrameworkElement; Point dragStart = DragManager.DragStartPosition; FrameworkElement dragItem = GetItemContainerFromPoint(AssociatedObject, dragStart) as FrameworkElement; Point itemPos = dragItem.TranslatePoint(new Point(), source); Point position = e.GetPosition(source); Point offset = new Point(dragStart.X - itemPos.X, dragStart.Y - itemPos.Y); Size size = new Size(dragItem.ActualWidth, dragItem.ActualHeight); IList data = DragDataManager.GetData(e.Data); _dragVisual = new DragVisual(data, source, AssociatedObject.ItemTemplate, offset, size); } e.Handled = true; } }
private void AssociatedObject_OnDragInitialize(object sender, DragInitializeEventArgs e) { e.Effects = DragDropEffects.All; IList selectedItems = GetSelectedItemsAsList(AssociatedObject); if (selectedItems.Count > 0) { if (GetItemContainerFromPoint(AssociatedObject, e.DragStartPosition) is FrameworkElement item) { Point mousePos = e.GetPosition(AssociatedObject); Point itemPos = item.TranslatePoint(new Point(), AssociatedObject); Point offset = new Point(mousePos.X - itemPos.X, mousePos.Y - itemPos.Y); e.DragVisualSize = new Size(item.ActualWidth, item.ActualHeight); e.DragVisualOffset = offset; e.Data = DragDataManager.GenerateDataObject(selectedItems); } else { AssociatedObject.SelectedItems.Clear(); } } }