diff --git a/src/Avalonia.Input/DragDropDevice.cs b/src/Avalonia.Input/DragDropDevice.cs index 2615e3a212..9fb100371f 100644 --- a/src/Avalonia.Input/DragDropDevice.cs +++ b/src/Avalonia.Input/DragDropDevice.cs @@ -19,11 +19,11 @@ namespace Avalonia.Input return null; } - private DragDropEffects RaiseDragEvent(Interactive target, RoutedEvent routedEvent, DragDropEffects operation, IDataObject data) + private DragDropEffects RaiseDragEvent(Interactive target, IInputElement inputRoot, Point point, RoutedEvent routedEvent, DragDropEffects operation, IDataObject data) { if (target == null) return DragDropEffects.None; - var args = new DragEventArgs(routedEvent, data) + var args = new DragEventArgs(routedEvent, data, target, inputRoot.TranslatePoint(point, target)) { RoutedEvent = routedEvent, DragEffects = operation @@ -35,7 +35,7 @@ namespace Avalonia.Input private DragDropEffects DragEnter(IInputElement inputRoot, Point point, IDataObject data, DragDropEffects effects) { _lastTarget = GetTarget(inputRoot, point); - return RaiseDragEvent(_lastTarget, DragDrop.DragEnterEvent, effects, data); + return RaiseDragEvent(_lastTarget, inputRoot, point, DragDrop.DragEnterEvent, effects, data); } private DragDropEffects DragOver(IInputElement inputRoot, Point point, IDataObject data, DragDropEffects effects) @@ -43,13 +43,13 @@ namespace Avalonia.Input var target = GetTarget(inputRoot, point); if (target == _lastTarget) - return RaiseDragEvent(target, DragDrop.DragOverEvent, effects, data); + return RaiseDragEvent(target, inputRoot, point, DragDrop.DragOverEvent, effects, data); try { if (_lastTarget != null) _lastTarget.RaiseEvent(new RoutedEventArgs(DragDrop.DragLeaveEvent)); - return RaiseDragEvent(target, DragDrop.DragEnterEvent, effects, data); + return RaiseDragEvent(target, inputRoot, point, DragDrop.DragEnterEvent, effects, data); } finally { @@ -75,7 +75,7 @@ namespace Avalonia.Input { try { - return RaiseDragEvent(_lastTarget, DragDrop.DropEvent, effects, data); + return RaiseDragEvent(_lastTarget, inputRoot, point, DragDrop.DropEvent, effects, data); } finally { diff --git a/src/Avalonia.Input/DragEventArgs.cs b/src/Avalonia.Input/DragEventArgs.cs index 12d5a8941e..669fd846a1 100644 --- a/src/Avalonia.Input/DragEventArgs.cs +++ b/src/Avalonia.Input/DragEventArgs.cs @@ -1,17 +1,40 @@ -using Avalonia.Interactivity; +using System; +using Avalonia.Interactivity; +using Avalonia.VisualTree; namespace Avalonia.Input { public class DragEventArgs : RoutedEventArgs { + private Interactive _target; + private Point _targetLocation; + public DragDropEffects DragEffects { get; set; } public IDataObject Data { get; private set; } - public DragEventArgs(RoutedEvent routedEvent, IDataObject data) + public Point GetPosition(IVisual relativeTo) + { + var point = new Point(0, 0); + + if (relativeTo == null) + { + throw new ArgumentNullException(nameof(relativeTo)); + } + + if (_target != null) + { + point = _target.TranslatePoint(_targetLocation, relativeTo); + } + return point; + } + + public DragEventArgs(RoutedEvent routedEvent, IDataObject data, Interactive target, Point targetLocation) : base(routedEvent) { this.Data = data; + this._target = target; + this._targetLocation = targetLocation; } }