private static void OnDropTargetAdvisorChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs args) { UIElement targetElt = depObj as UIElement; if (args.NewValue != null && args.OldValue == null) { targetElt.PreviewDragEnter += DropTarget_PreviewDragEnter; targetElt.PreviewDragOver += DropTarget_PreviewDragOver; targetElt.PreviewDragLeave += DropTarget_PreviewDragLeave; targetElt.PreviewDrop += DropTarget_PreviewDrop; targetElt.AllowDrop = true; // Set the Drag source UI IDropTargetAdvisor advisor = args.NewValue as IDropTargetAdvisor; advisor.TargetUI = targetElt; } else if (args.NewValue == null && args.OldValue != null) { targetElt.PreviewDragEnter -= DropTarget_PreviewDragEnter; targetElt.PreviewDragOver -= DropTarget_PreviewDragOver; targetElt.PreviewDragLeave -= DropTarget_PreviewDragLeave; targetElt.PreviewDrop -= DropTarget_PreviewDrop; targetElt.AllowDrop = false; } }
/// <summary> /// Handles the PreviewDragOver event of the DropTarget control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="System.Windows.DragEventArgs" /> instance containing the event data.</param> private static void DropTargetPreviewDragOver(object sender, DragEventArgs e) { Debug.Assert(sender is UIElement, "Awaiting sender of type UIElement"); // Get the current drop target advisor CurrentDropTargetAdvisor = GetDropTargetAdvisor((DependencyObject)sender); UpdateEffects(e); // Update position of the preview Adorner adornerPosition = e.GetPosition((UIElement)sender); PositionAdorner(); // Let the target do some stuff ----------------------- var dropPoint = e.GetPosition((UIElement)sender); // Calculate displacement for (Left, Top) var offset = e.GetPosition(overlayElt); dropPoint.X = dropPoint.X - offset.X; dropPoint.Y = dropPoint.Y - offset.Y; CurrentDropTargetAdvisor.OnDropQuery(e.Data, dropPoint); e.Handled = true; }
private static bool UpdateEffects(object uobject, DragEventArgs e) { IDropTargetAdvisor advisor = GetDropTargetAdvisor(uobject as DependencyObject); if (advisor.IsValidDataObject(e.Data) == false) { return(false); } if ((e.AllowedEffects & DragDropEffects.Move) == 0 && (e.AllowedEffects & DragDropEffects.Copy) == 0) { e.Effects = DragDropEffects.None; return(true); } if ((e.AllowedEffects & DragDropEffects.Move) != 0 && (e.AllowedEffects & DragDropEffects.Copy) != 0) { if ((e.KeyStates & DragDropKeyStates.ControlKey) != 0) { } e.Effects = ((e.KeyStates & DragDropKeyStates.ControlKey) != 0) ? DragDropEffects.Copy : DragDropEffects.Move; } return(true); }
static void CreatePreviewAdorner(object sender, DragEventArgs e) { // Set the Drag source UI IDropTargetAdvisor adv = GetDropTargetAdvisor(sender as FrameworkElement); adv.TargetUI = sender as UIElement; // get the data // get the UIFeedback UIFeedback = adv.GetVisualFeedback(e.Data); DoubleAnimation anim = new DoubleAnimation(0.75, new Duration(TimeSpan.FromMilliseconds(500))); anim.From = 0.25; anim.AutoReverse = true; anim.RepeatBehavior = RepeatBehavior.Forever; UIFeedback.BeginAnimation(UIElement.OpacityProperty, anim); UIFeedback.IsHitTestVisible = false; // add it to the adornment layer AdornerLayer layer = AdornerLayer.GetAdornerLayer(sender as UIElement); Overlay = new DropPreviewAdorner(UIFeedback, sender as UIElement, layer); layer.Add(Overlay); Overlay.Location = GetOverlaypoint(sender, e); }
static bool UpdateEffects(object sender, DragEventArgs e) { IDropTargetAdvisor advisor = GetDropTargetAdvisor(sender as FrameworkElement); if (!advisor.IsValidDataObject(e.Data)) { return(false); } // TODO: cope with Link, Scroll if ((e.AllowedEffects & DragDropEffects.Move) == 0 && (e.AllowedEffects & DragDropEffects.Copy) == 0) { e.Effects = DragDropEffects.None; return(false); } if ((e.AllowedEffects & DragDropEffects.Move) != 0) { e.Effects = DragDropEffects.Move; } if ((e.AllowedEffects & DragDropEffects.Copy) != 0) { if ((e.AllowedEffects & DragDropEffects.Move) == 0 || (e.KeyStates & DragDropKeyStates.ControlKey) != 0) { e.Effects = DragDropEffects.Copy; } } return(true); }
/// <summary> /// Handles the PreviewDragLeave event of the DropTarget control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="System.Windows.DragEventArgs" /> instance containing the event data.</param> private static void DropTargetPreviewDragLeave(object sender, DragEventArgs e) { UpdateEffects(e); RemovePreviewAdorner(); // Get the current drop target advisor CurrentDropTargetAdvisor = GetDropTargetAdvisor((DependencyObject)sender); CurrentDropTargetAdvisor.OnLeaveDropZone(e.Data); e.Handled = true; }
/// <summary> /// Called when the input system reports an underlying drag event with drop area element as the drag target. /// </summary> /// <param name="sender">Drop area element.</param> /// <param name="e">Contains arguments relevant to all drag-and-drop events.</param> private static void DropTargetPreviewDragEnter(object sender, DragEventArgs e) { currentTargetAdvisor = GetDropTargetAdvisor(sender as DependencyObject); if (UpdateEffects((UIElement)sender, e) == false) { return; } Point point = CalculateAdornerOffset(e); CreatePreviewAdorner(point.X, point.Y); e.Handled = true; }
private static void DropTarget_PreviewDragEnter(object sender, DragEventArgs e) { // Get the current drop target advisor CurrentDropTargetAdvisor = GetDropTargetAdvisor(sender as DependencyObject); UpdateEffects(e); // Setup the preview Adorner _offsetPoint = new Point(); if (CurrentDropTargetAdvisor.ApplyMouseOffset && e.Data.GetData(DragOffsetFormat) != null) { _offsetPoint = (Point)e.Data.GetData(DragOffsetFormat); } CreatePreviewAdorner(sender as UIElement, e.Data); e.Handled = true; }
private static void DropTargetPreviewDrop(object sender, DragEventArgs e) { if (UpdateEffects(sender, e) == false) { return; } IDropTargetAdvisor advisor = GetDropTargetAdvisor(sender as DependencyObject); Point dropPoint = e.GetPosition(sender as UIElement); // Calculate displacement for (Left, Top) Point offset = e.GetPosition(s_OverlayElement); dropPoint.X = dropPoint.X - offset.X; dropPoint.Y = dropPoint.Y - offset.Y; advisor.OnDropCompleted(e.Data, dropPoint); RemovePreviewAdorner(); s_OffsetPoint = new Point(0, 0); }
private static void DropTarget_PreviewDragEnter(object sender, DragEventArgs e) { // Get the current drop target advisor CurrentDropTargetAdvisor = GetDropTargetAdvisor(sender as DependencyObject); if (UpdateEffects(sender, e) == false) { return; } // Setup the preview Adorner UIElement feedbackUI = CurrentDropTargetAdvisor.GetVisualFeedback(e.Data); _offsetPoint = CurrentDropTargetAdvisor.ApplyMouseOffset ? (Point)e.Data.GetData(DragOffsetFormat) : new Point(); CreatePreviewAdorner(sender as UIElement, feedbackUI); e.Handled = true; }
public static void SetDropTargetAdvisor(DependencyObject depObj, IDropTargetAdvisor advisor) { depObj.SetValue(DropTargetAdvisorProperty, advisor); }
private static void DropTarget_PreviewDragEnter(object sender, DragEventArgs e) { // Get the current drop target advisor CurrentDropTargetAdvisor = GetDropTargetAdvisor(sender as DependencyObject); CurrentDropTargetAdvisor.TargetUI = sender as UIElement; UpdateEffects(e); // Setup the preview Adorner _offsetPoint = new Point(); if (CurrentDropTargetAdvisor.ApplyMouseOffset && e.Data.GetData(DragOffsetFormat) != null) { _offsetPoint = (Point) e.Data.GetData(DragOffsetFormat); } CreatePreviewAdorner(sender as UIElement, e.Data); e.Handled = true; }
public static void SetDropTargetAdvisor(FrameworkElement depo, IDropTargetAdvisor advisor) { depo.SetValue(DropTargetAdvisorProperty, advisor); }