private static DragDropPreview GetDragDropPreview(IDragInfo dragInfo, UIElement visualTarget, UIElement sender) { var visualSource = dragInfo?.VisualSource; if (visualSource is null) { return(null); } var hasDragDropPreview = DragDropPreview.HasDragDropPreview(dragInfo, visualTarget ?? visualSource, sender); if (hasDragDropPreview) { var rootElement = TryGetRootElementFinder(sender).FindRoot(visualTarget ?? visualSource); var preview = new DragDropPreview(rootElement, dragInfo, visualTarget ?? visualSource, sender); if (preview.Child != null) { preview.IsOpen = true; return(preview); } } return(null); }
private static DragDropPreview GetDragDropPreview(DropInfo dropInfo, UIElement target) { var dragInfo = dropInfo.DragInfo; var template = GetDropAdornerTemplate(dropInfo.VisualTarget) ?? GetDragAdornerTemplate(dragInfo.VisualSource); var templateSelector = GetDropAdornerTemplateSelector(dropInfo.VisualTarget) ?? GetDragAdornerTemplateSelector(dragInfo.VisualSource); UIElement adornment = null; var useDefaultDragAdorner = template == null && templateSelector == null && GetUseDefaultDragAdorner(dragInfo.VisualSource); var useVisualSourceItemSizeForDragAdorner = GetUseVisualSourceItemSizeForDragAdorner(dragInfo.VisualSource); if (useDefaultDragAdorner) { template = dragInfo.VisualSourceItem.GetCaptureScreenDataTemplate(dragInfo.VisualSourceFlowDirection); } 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; itemsControl.Tag = dragInfo; 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; contentPresenter.Tag = dragInfo; 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 = TryGetRootElementFinder(target).FindRoot(dropInfo.VisualTarget ?? dragInfo.VisualSource); var preview = new DragDropPreview(rootElement, adornment, GetDragAdornerTranslation(dragInfo.VisualSource), GetDragMouseAnchorPoint(dragInfo.VisualSource)) { IsOpen = true }; return(preview); } return(null); }