Browse Source

allow for content changes with no mouse movement

ahopper 7 years ago
parent
commit
e11af71e9f

+ 7 - 1
src/Avalonia.Controls/TopLevel.cs

@@ -230,8 +230,9 @@ namespace Avalonia.Controls
         void IRenderRoot.Invalidate(Rect rect)
         {
             PlatformImpl?.Invalidate(rect);
+            UpdatePointerOver();
         }
-
+        
         /// <inheritdoc/>
         Point IRenderRoot.PointToClient(Point p)
         {
@@ -349,5 +350,10 @@ namespace Avalonia.Controls
         {
             _inputManager.ProcessInput(e);
         }
+
+        private void UpdatePointerOver()
+        {
+            (this as IInputRoot).MouseDevice.LayoutUpdated(this);
+        }
     }
 }

+ 2 - 0
src/Avalonia.Input/IPointerDevice.cs

@@ -12,5 +12,7 @@ namespace Avalonia.Input
         void Capture(IInputElement control);
 
         Point GetPosition(IVisual relativeTo);
+
+        void LayoutUpdated(IInputRoot root);
     }
 }

+ 26 - 18
src/Avalonia.Input/MouseDevice.cs

@@ -104,6 +104,18 @@ namespace Avalonia.Input
                 ProcessRawEvent(margs);
         }
 
+        public void LayoutUpdated(IInputRoot root)
+        {
+            if (Captured == null)
+            {
+                SetPointerOver(this, root, root.PointToClient(Position));    
+            }
+            else
+            {
+                SetPointerOver(this, root, Captured);               
+            }                   
+        }
+
         private void ProcessRawEvent(RawMouseEventArgs e)
         {
             Contract.Requires<ArgumentNullException>(e != null);
@@ -298,7 +310,7 @@ namespace Avalonia.Input
             Contract.Requires<ArgumentNullException>(device != null);
             Contract.Requires<ArgumentNullException>(root != null);
 
-            var element = root.PointerOverElement;           
+            var element = root.PointerOverElement;
             var e = new PointerEventArgs
             {
                 RoutedEvent = InputElement.PointerLeaveEvent,
@@ -311,16 +323,14 @@ namespace Avalonia.Input
                 if (root.IsPointerOver)
                     ClearChildrenPointerOver(e, root,true);
             }
-            else
+            while (element != null)
             {
-                while (element != null)
-                {
-                    e.Source = element;
-                    e.Handled = false;
-                    element.RaiseEvent(e);
-                    element = (IInputElement)element.VisualParent;
-                }
+                e.Source = element;
+                e.Handled = false;
+                element.RaiseEvent(e);
+                element = (IInputElement)element.VisualParent;
             }
+            
             root.PointerOverElement = null;
         }
 
@@ -392,16 +402,14 @@ namespace Avalonia.Input
             {
                 ClearChildrenPointerOver(e,branch,false);
             }
-            else
+            
+            while (el != null && el != branch)
             {
-                while (el != null && el != branch)
-                {
-                    e.Source = el;
-                    e.Handled = false;
-                    el.RaiseEvent(e);
-                    el = (IInputElement)el.VisualParent;
-                }
-            }
+                e.Source = el;
+                e.Handled = false;
+                el.RaiseEvent(e);
+                el = (IInputElement)el.VisualParent;
+            }            
 
             el = root.PointerOverElement = element;
             e.RoutedEvent = InputElement.PointerEnterEvent;