Browse Source

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

fixes an occasional crash with popup root "SnapInsideScreenEdges"
pull/1808/head
danwalmsley 8 years ago
committed by GitHub
parent
commit
8cc74604b3
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 25
      src/Avalonia.Controls/Primitives/PopupRoot.cs
  2. 5
      tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs

25
src/Avalonia.Controls/Primitives/PopupRoot.cs

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

5
tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs

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

Loading…
Cancel
Save