From 6dfd7056606427ffa8e4c54d706f937b2eb20a44 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 5 May 2018 22:07:26 +0200 Subject: [PATCH 1/5] Added failing test for #1548. Caused by a bug in Portable.Xaml: https://github.com/cwensley/Portable.Xaml/issues/95 --- .../Xaml/BasicTests.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs index ac25b7ccbe..4213a31c39 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs @@ -81,6 +81,21 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml Assert.Equal(21.0, TextBlock.GetFontSize(target)); } + [Fact] + public void Attached_Property_Is_Set_On_Control_Outside_Avalonia_Namspace() + { + // Test for issue #1548 + var xaml = +@" + +"; + + var target = AvaloniaXamlLoader.Parse(xaml); + + Assert.Equal(2, Grid.GetColumn((TestControl)target.Content)); + } + [Fact] public void Attached_Property_With_Namespace_Is_Set() { From 6a6662df92e9c97e125e11ec309c448b6740290a Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 5 May 2018 22:13:02 +0200 Subject: [PATCH 2/5] Fix attached member namespaces resolution. Updated Portable.Xaml to include fix from https://github.com/cwensley/Portable.Xaml/pull/96 --- .../Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github index faa952f3a0..cdf46d7892 160000 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github +++ b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github @@ -1 +1 @@ -Subproject commit faa952f3a05b4bdf2986d686f4154b1ab084508a +Subproject commit cdf46d7892def8a6ba29f12a9339147377f7cf5c From ee0c3dfa94f750db1657d93047f704ee2a736dd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Sun, 6 May 2018 15:40:15 +0200 Subject: [PATCH 3/5] Add GetPosition method to DragEventArgs --- src/Avalonia.Input/DragDropDevice.cs | 12 ++++++------ src/Avalonia.Input/DragEventArgs.cs | 27 +++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/Avalonia.Input/DragDropDevice.cs b/src/Avalonia.Input/DragDropDevice.cs index 2615e3a212..4b196ba161 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, Point targetLocation, 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, targetLocation) { 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, _lastTarget != null ? inputRoot.TranslatePoint(point, _lastTarget) : 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, _lastTarget != null ? inputRoot.TranslatePoint(point, _lastTarget) : 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, _lastTarget != null ? inputRoot.TranslatePoint(point, _lastTarget) : point, DragDrop.DragEnterEvent, effects, data); } finally { @@ -75,7 +75,7 @@ namespace Avalonia.Input { try { - return RaiseDragEvent(_lastTarget, DragDrop.DropEvent, effects, data); + return RaiseDragEvent(_lastTarget, _lastTarget != null ? inputRoot.TranslatePoint(point, _lastTarget) : 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; } } From 7b56a5cc1c4fd9f025f57c4725765a311116fd03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Sun, 6 May 2018 16:28:27 +0200 Subject: [PATCH 4/5] Remove code duplication --- src/Avalonia.Input/DragDropDevice.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Avalonia.Input/DragDropDevice.cs b/src/Avalonia.Input/DragDropDevice.cs index 4b196ba161..1ed65ac6d7 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, Point targetLocation, 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, target, targetLocation) + var args = new DragEventArgs(routedEvent, data, target, target != null ? inputRoot.TranslatePoint(point, target) : point) { 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, _lastTarget != null ? inputRoot.TranslatePoint(point, _lastTarget) : point, 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, _lastTarget != null ? inputRoot.TranslatePoint(point, _lastTarget) : point, 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, _lastTarget != null ? inputRoot.TranslatePoint(point, _lastTarget) : point, 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, _lastTarget != null ? inputRoot.TranslatePoint(point, _lastTarget) : point, DragDrop.DropEvent, effects, data); + return RaiseDragEvent(_lastTarget, inputRoot, point, DragDrop.DropEvent, effects, data); } finally { From 3fb17af5718567a0c20c23e7949ff20d76c6b651 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Sun, 6 May 2018 16:42:40 +0200 Subject: [PATCH 5/5] Remove null check --- src/Avalonia.Input/DragDropDevice.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Input/DragDropDevice.cs b/src/Avalonia.Input/DragDropDevice.cs index 1ed65ac6d7..9fb100371f 100644 --- a/src/Avalonia.Input/DragDropDevice.cs +++ b/src/Avalonia.Input/DragDropDevice.cs @@ -23,7 +23,7 @@ namespace Avalonia.Input { if (target == null) return DragDropEffects.None; - var args = new DragEventArgs(routedEvent, data, target, target != null ? inputRoot.TranslatePoint(point, target) : point) + var args = new DragEventArgs(routedEvent, data, target, inputRoot.TranslatePoint(point, target)) { RoutedEvent = routedEvent, DragEffects = operation