Browse Source

Merge pull request #2924 from AvaloniaUI/fixes/2821-clear-pointerover-on-close

Clear pointer-over state when TopLevel closed.
danwalmsley 6 years ago
parent
commit
cd0417d987

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

@@ -269,8 +269,8 @@ namespace Avalonia.Controls
         /// </summary>
         protected virtual void HandleClosed()
         {
+            (this as IInputRoot).MouseDevice?.TopLevelClosed(this);
             PlatformImpl = null;
-
             Closed?.Invoke(this, EventArgs.Empty);
             Renderer?.Dispose();
             Renderer = null;

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

@@ -16,6 +16,8 @@ namespace Avalonia.Input
         [Obsolete("Use PointerEventArgs.GetPosition")]
         PixelPoint Position { get; }
 
+        void TopLevelClosed(IInputRoot root);
+
         void SceneInvalidated(IInputRoot root, Rect rect);
     }
 }

+ 5 - 0
src/Avalonia.Input/MouseDevice.cs

@@ -86,6 +86,11 @@ namespace Avalonia.Input
                 ProcessRawEvent(margs);
         }
 
+        public void TopLevelClosed(IInputRoot root)
+        {
+            ClearPointerOver(this, 0, root, PointerPointProperties.None, KeyModifiers.None);
+        }
+
         public void SceneInvalidated(IInputRoot root, Rect rect)
         {
             var clientPoint = root.PointToClient(Position);

+ 18 - 0
tests/Avalonia.Controls.UnitTests/TopLevelTests.cs

@@ -224,6 +224,24 @@ namespace Avalonia.Controls.UnitTests
             }
         }
 
+        [Fact]
+        public void Close_Should_Notify_MouseDevice()
+        {
+            using (UnitTestApplication.Start(TestServices.StyledWindow))
+            {
+                var impl = new Mock<ITopLevelImpl>();
+                var mouseDevice = new Mock<IMouseDevice>();
+                impl.SetupAllProperties();
+                impl.Setup(x => x.MouseDevice).Returns(mouseDevice.Object);
+
+                var target = new TestTopLevel(impl.Object);
+
+                impl.Object.Closed();
+
+                mouseDevice.Verify(x => x.TopLevelClosed(target));
+            }
+        }
+
         private FuncControlTemplate<TestTopLevel> CreateTemplate()
         {
             return new FuncControlTemplate<TestTopLevel>((x, scope) =>