private static void DropTargetOnDragOver(object sender, DragEventArgs e) { var elementPosition = e.GetPosition((IInputElement)sender); var dragInfo = m_DragInfo; var dropInfo = new DropInfo(sender, e, dragInfo); var dropHandler = TryGetDropHandler(dropInfo, sender as UIElement); var itemsControl = dropInfo.VisualTarget; dropHandler.DragOver(dropInfo); if (DragAdorner == null && dragInfo != null) { CreateDragAdorner(dropInfo); } if (DragAdorner != null) { var tempAdornerPos = e.GetPosition(DragAdorner.AdornedElement); if (tempAdornerPos.X >= 0 && tempAdornerPos.Y >= 0) { _adornerPos = tempAdornerPos; } // Fixed the flickering adorner - Size changes to zero 'randomly'...? if (DragAdorner.RenderSize.Width > 0 && DragAdorner.RenderSize.Height > 0) { _adornerSize = DragAdorner.RenderSize; } if (dragInfo != null) { // move the adorner var offsetX = _adornerSize.Width * -GetDragMouseAnchorPoint(dragInfo.VisualSource).X; var offsetY = _adornerSize.Height * -GetDragMouseAnchorPoint(dragInfo.VisualSource).Y; _adornerPos.Offset(offsetX, offsetY); var maxAdornerPosX = DragAdorner.AdornedElement.RenderSize.Width; var adornerPosRightX = (_adornerPos.X + _adornerSize.Width); if (adornerPosRightX > maxAdornerPosX) { _adornerPos.Offset(-adornerPosRightX + maxAdornerPosX, 0); } if (_adornerPos.Y < 0) { _adornerPos.Y = 0; } } DragAdorner.MousePosition = _adornerPos; DragAdorner.InvalidateVisual(); } Scroll(dropInfo, e); if (HitTestUtilities.HitTest4Type <ScrollBar>(sender, elementPosition) || HitTestUtilities.HitTest4GridViewColumnHeader(sender, elementPosition) || HitTestUtilities.HitTest4DataGridTypesOnDragOver(sender, elementPosition)) { e.Effects = DragDropEffects.None; e.Handled = true; return; } // If the target is an ItemsControl then update the drop target adorner. if (itemsControl != null) { // Display the adorner in the control's ItemsPresenter. If there is no // ItemsPresenter provided by the style, try getting hold of a // ScrollContentPresenter and using that. UIElement adornedElement = null; if (itemsControl is TabControl) { adornedElement = itemsControl.GetVisualDescendent <TabPanel>(); } else if (itemsControl is DataGrid || (itemsControl as ListView)?.View is GridView) { adornedElement = itemsControl.GetVisualDescendent <ScrollContentPresenter>() as UIElement ?? itemsControl.GetVisualDescendent <ItemsPresenter>() as UIElement ?? itemsControl; } else { adornedElement = itemsControl.GetVisualDescendent <ItemsPresenter>() as UIElement ?? itemsControl.GetVisualDescendent <ScrollContentPresenter>() as UIElement ?? itemsControl; } if (adornedElement != null) { if (dropInfo.DropTargetAdorner == null) { DropTargetAdorner = null; } else if (!dropInfo.DropTargetAdorner.IsInstanceOfType(DropTargetAdorner)) { DropTargetAdorner = DropTargetAdorner.Create(dropInfo.DropTargetAdorner, adornedElement, dropInfo); } var adorner = DropTargetAdorner; if (adorner != null) { var adornerBrush = GetDropTargetAdornerBrush(dropInfo.VisualTarget); if (adornerBrush != null) { adorner.Pen.Brush = adornerBrush; } adorner.DropInfo = dropInfo; adorner.InvalidateVisual(); } } } // Set the drag effect adorner if there is one if (dragInfo != null && (EffectAdorner == null || EffectAdorner.Effects != dropInfo.Effects)) { CreateEffectAdorner(dropInfo); } if (EffectAdorner != null) { var adornerPos = e.GetPosition(EffectAdorner.AdornedElement); //adornerPos.Offset(20, 20); EffectAdorner.MousePosition = adornerPos; EffectAdorner.InvalidateVisual(); } e.Effects = dropInfo.Effects; e.Handled = !dropInfo.NotHandled; if (!dropInfo.IsSameDragDropContextAsSource) { e.Effects = DragDropEffects.None; } }
private static void CreateDragAdorner(DropInfo dropInfo) { var dragInfo = m_DragInfo; var template = GetDragAdornerTemplate(dragInfo.VisualSource); var templateSelector = GetDragAdornerTemplateSelector(dragInfo.VisualSource); UIElement adornment = null; var useDefaultDragAdorner = GetUseDefaultDragAdorner(dragInfo.VisualSource); var useVisualSourceItemSizeForDragAdorner = GetUseVisualSourceItemSizeForDragAdorner(dragInfo.VisualSource); if (template == null && templateSelector == null && useDefaultDragAdorner) { var bs = CaptureScreen(dragInfo.VisualSourceItem, dragInfo.VisualSourceFlowDirection); if (bs != null) { var factory = new FrameworkElementFactory(typeof(Image)); factory.SetValue(Image.SourceProperty, bs); factory.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased); factory.SetValue(RenderOptions.BitmapScalingModeProperty, BitmapScalingMode.HighQuality); factory.SetValue(FrameworkElement.WidthProperty, bs.Width); factory.SetValue(FrameworkElement.HeightProperty, bs.Height); factory.SetValue(FrameworkElement.HorizontalAlignmentProperty, HorizontalAlignment.Left); factory.SetValue(FrameworkElement.VerticalAlignmentProperty, VerticalAlignment.Top); template = new DataTemplate { VisualTree = factory }; } } if (template != null || templateSelector != null) { if (dragInfo.Data is IEnumerable && !(dragInfo.Data is string)) { if (!useDefaultDragAdorner && ((IEnumerable)dragInfo.Data).Cast <object>().Count() <= 10) { var itemsControl = new ItemsControl(); itemsControl.ItemsSource = (IEnumerable)dragInfo.Data; itemsControl.ItemTemplate = template; itemsControl.ItemTemplateSelector = templateSelector; if (useVisualSourceItemSizeForDragAdorner) { var bounds = VisualTreeHelper.GetDescendantBounds(dragInfo.VisualSourceItem); itemsControl.SetValue(FrameworkElement.MinWidthProperty, bounds.Width); } // The ItemsControl doesn't display unless we create a grid to contain it. // Not quite sure why we need this... var grid = new Grid(); grid.Children.Add(itemsControl); adornment = grid; } } else { var contentPresenter = new ContentPresenter(); contentPresenter.Content = dragInfo.Data; contentPresenter.ContentTemplate = template; contentPresenter.ContentTemplateSelector = templateSelector; if (useVisualSourceItemSizeForDragAdorner) { var bounds = VisualTreeHelper.GetDescendantBounds(dragInfo.VisualSourceItem); contentPresenter.SetValue(FrameworkElement.MinWidthProperty, bounds.Width); contentPresenter.SetValue(FrameworkElement.MinHeightProperty, bounds.Height); } adornment = contentPresenter; } } if (adornment != null) { if (useDefaultDragAdorner) { adornment.Opacity = GetDefaultDragAdornerOpacity(dragInfo.VisualSource); } var rootElement = RootElementFinder.FindRoot(dropInfo.VisualTarget ?? dragInfo.VisualSource); DragAdorner = new DragAdorner(rootElement, adornment, GetDragAdornerTranslation(dragInfo.VisualSource)); } }