Переглянути джерело

Merge remote-tracking branch 'origin/master' into feature/password-box

Dan Walmsley 7 роки тому
батько
коміт
5d138be580

+ 6 - 6
src/Avalonia.Input/DragDropDevice.cs

@@ -19,11 +19,11 @@ namespace Avalonia.Input
             return null;
         }
         
-        private DragDropEffects RaiseDragEvent(Interactive target, RoutedEvent<DragEventArgs> routedEvent, DragDropEffects operation, IDataObject data)
+        private DragDropEffects RaiseDragEvent(Interactive target, IInputElement inputRoot, Point point, RoutedEvent<DragEventArgs> 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 
             {

+ 25 - 2
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<DragEventArgs> 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<DragEventArgs> routedEvent, IDataObject data, Interactive target, Point targetLocation)
             : base(routedEvent)
         {
             this.Data = data;
+            this._target = target;
+            this._targetLocation = targetLocation;
         }
 
     }

+ 1 - 1
src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github

@@ -1 +1 @@
-Subproject commit faa952f3a05b4bdf2986d686f4154b1ab084508a
+Subproject commit cdf46d7892def8a6ba29f12a9339147377f7cf5c

+ 3 - 0
src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs

@@ -870,6 +870,9 @@ namespace Avalonia.Win32.Interop
             return SetClassLong64(hWnd, nIndex, dwNewLong);
         }
 
+        [DllImport("user32.dll", EntryPoint = "SetCursor")]
+        internal static extern IntPtr SetCursor(IntPtr hCursor);
+
         [DllImport("ole32.dll", PreserveSig = true)]
         internal static extern int CoCreateInstance(ref Guid clsid,
             IntPtr ignore1, int ignore2, ref Guid iid, [MarshalAs(UnmanagedType.IUnknown), Out] out object pUnkOuter);

+ 5 - 2
src/Windows/Avalonia.Win32/WindowImpl.cs

@@ -399,8 +399,11 @@ namespace Avalonia.Win32
 
         public void SetCursor(IPlatformHandle cursor)
         {
-            UnmanagedMethods.SetClassLong(_hwnd, UnmanagedMethods.ClassLongIndex.GCL_HCURSOR,
-                cursor?.Handle ?? DefaultCursor);
+            var hCursor = cursor?.Handle ?? DefaultCursor;
+            UnmanagedMethods.SetClassLong(_hwnd, UnmanagedMethods.ClassLongIndex.GCL_HCURSOR, hCursor);
+
+            if (_owner.IsPointerOver)
+                UnmanagedMethods.SetCursor(hCursor);
         }
 
         protected virtual IntPtr CreateWindowOverride(ushort atom)

+ 15 - 0
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 =
+@"<UserControl xmlns='https://github.com/avaloniaui'
+    xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'>
+  <local:TestControl Grid.Column='2' />
+</UserControl>";
+
+            var target = AvaloniaXamlLoader.Parse<UserControl>(xaml);
+
+            Assert.Equal(2, Grid.GetColumn((TestControl)target.Content));
+        }
+
         [Fact]
         public void Attached_Property_With_Namespace_Is_Set()
         {