Răsfoiți Sursa

Merge pull request #1806 from AvaloniaUI/fix-popup-root-exception

fixes an occasional crash with popup root "SnapInsideScreenEdges"
danwalmsley 7 ani în urmă
părinte
comite
8cc74604b3

+ 13 - 12
src/Avalonia.Controls/Primitives/PopupRoot.cs

@@ -83,21 +83,22 @@ namespace Avalonia.Controls.Primitives
         /// </summary>
         public void SnapInsideScreenEdges()
         {
-            var window = this.GetSelfAndLogicalAncestors().OfType<Window>().First();
-            
-            var screen = window.Screens.ScreenFromPoint(Position);
+            var screen = Application.Current.MainWindow?.Screens.ScreenFromPoint(Position);
 
-            var screenX = Position.X + Bounds.Width - screen.Bounds.X;
-            var screenY = Position.Y + Bounds.Height - screen.Bounds.Y;
-
-            if (screenX > screen.Bounds.Width)
+            if (screen != null)
             {
-                Position = Position.WithX(Position.X - (screenX - screen.Bounds.Width));
-            }
+                var screenX = Position.X + Bounds.Width - screen.Bounds.X;
+                var screenY = Position.Y + Bounds.Height - screen.Bounds.Y;
 
-            if (screenY > screen.Bounds.Height)
-            {
-                Position = Position.WithY(Position.Y - (screenY - screen.Bounds.Height));
+                if (screenX > screen.Bounds.Width)
+                {
+                    Position = Position.WithX(Position.X - (screenX - screen.Bounds.Width));
+                }
+
+                if (screenY > screen.Bounds.Height)
+                {
+                    Position = Position.WithY(Position.Y - (screenY - screen.Bounds.Height));
+                }
             }
         }
 

+ 4 - 1
tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs

@@ -64,7 +64,10 @@ namespace Avalonia.Controls.UnitTests
                 {
                     ContextMenu = sut
                 };
-                new Window { Content = target };
+
+                var window = new Window { Content = target };
+
+                Avalonia.Application.Current.MainWindow = window;
 
                 target.RaiseEvent(new PointerReleasedEventArgs
                 {