Browse Source

fix opening child window center screen when parent maximized.

pull/7768/head
Dan Walmsley 4 years ago
parent
commit
947e358733
  1. 2
      src/Avalonia.Controls/Platform/IScreenImpl.cs
  2. 17
      src/Avalonia.Controls/Screens.cs
  3. 13
      src/Avalonia.Controls/Window.cs
  4. 5
      src/Avalonia.DesignerSupport/Remote/Stubs.cs
  5. 5
      src/Avalonia.Headless/HeadlessPlatformStubs.cs
  6. 5
      src/Avalonia.Native/ScreenImpl.cs
  7. 5
      src/Avalonia.X11/X11Screens.cs
  8. 9
      src/Windows/Avalonia.Win32/ScreenImpl.cs
  9. 2
      src/Windows/Avalonia.Win32/WinScreen.cs

2
src/Avalonia.Controls/Platform/IScreenImpl.cs

@ -7,5 +7,7 @@ namespace Avalonia.Platform
int ScreenCount { get; }
IReadOnlyList<Screen> AllScreens { get; }
Screen? ScreenFromWindow(IWindowImpl windowImpl);
}
}

17
src/Avalonia.Controls/Screens.cs

@ -52,5 +52,22 @@ namespace Avalonia.Controls
var br = visual.PointToScreen(visual.Bounds.BottomRight);
return ScreenFromBounds(new PixelRect(tl, br));
}
public Screen? ScreenFromWindow(Window window)
{
Screen? screen = null;
if (window.PlatformImpl != null)
{
screen = _iScreenImpl?.ScreenFromWindow(window.PlatformImpl) ?? null;
if (screen is { })
{
return screen;
}
}
return ScreenFromPoint(window.Position);
}
}
}

13
src/Avalonia.Controls/Window.cs

@ -879,8 +879,17 @@ namespace Avalonia.Controls
if (startupLocation == WindowStartupLocation.CenterScreen)
{
var screen = Screens.ScreenFromPoint(owner?.Position ?? Position);
Screen? screen = null;
if (Owner is Window ownerWin)
{
screen = Screens.ScreenFromWindow(ownerWin);
}
else
{
screen = Screens.ScreenFromPoint(Position);
}
if (screen != null)
{
Position = screen.WorkingArea.CenterRect(rect).Position;

5
src/Avalonia.DesignerSupport/Remote/Stubs.cs

@ -237,5 +237,10 @@ namespace Avalonia.DesignerSupport.Remote
public IReadOnlyList<Screen> AllScreens { get; } =
new Screen[] { new Screen(1, new PixelRect(0, 0, 4000, 4000), new PixelRect(0, 0, 4000, 4000), true) };
public Screen? ScreenFromWindow(IWindowImpl windowImpl)
{
return null;
}
}
}

5
src/Avalonia.Headless/HeadlessPlatformStubs.cs

@ -200,5 +200,10 @@ namespace Avalonia.Headless
new Screen(1, new PixelRect(0, 0, 1920, 1280),
new PixelRect(0, 0, 1920, 1280), true),
};
public Screen ScreenFromWindow(IWindowImpl windowImpl)
{
return null;
}
}
}

5
src/Avalonia.Native/ScreenImpl.cs

@ -42,6 +42,11 @@ namespace Avalonia.Native
return Array.Empty<Screen>();
}
}
public Screen ScreenFromWindow(IWindowImpl windowImpl)
{
return null;
}
public void Dispose ()
{

5
src/Avalonia.X11/X11Screens.cs

@ -17,6 +17,11 @@ namespace Avalonia.X11
{
_impl = impl;
}
public Screen ScreenFromWindow(IWindowImpl windowImpl)
{
return null;
}
static unsafe X11Screen[] UpdateWorkArea(X11Info info, X11Screen[] screens)
{

9
src/Windows/Avalonia.Win32/ScreenImpl.cs

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Avalonia.Platform;
using Avalonia.Win32.Interop;
using static Avalonia.Win32.Interop.UnmanagedMethods;
@ -70,5 +71,13 @@ namespace Avalonia.Win32
{
_allScreens = null;
}
public Screen? ScreenFromWindow(IWindowImpl windowImpl)
{
var hmonitor = MonitorFromWindow(windowImpl.Handle.Handle, MONITOR.MONITOR_DEFAULTTONEAREST);
return AllScreens.Select(x => x as WinScreen).Where(x => x is { })
.FirstOrDefault(x => x.Handle == hmonitor);
}
}
}

2
src/Windows/Avalonia.Win32/WinScreen.cs

@ -21,5 +21,7 @@ namespace Avalonia.Win32
{
return (obj is WinScreen screen) ? this._hMonitor == screen._hMonitor : base.Equals(obj);
}
internal IntPtr Handle => _hMonitor;
}
}

Loading…
Cancel
Save