diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 842bf3dc72..c2f8eb3dbf 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -580,23 +580,19 @@ namespace Avalonia.Win32 /// /// Ported from https://github.com/chromium/chromium/blob/master/ui/views/win/fullscreen_handler.cc + /// Method must only be called from inside UpdateWindowProperties. /// /// private void SetFullScreen(bool fullscreen) { - // Save current window state if not already fullscreen. - if (!_windowProperties.IsFullScreen) + if (fullscreen) { + // Save current window state if not already fullscreen. _savedWindowInfo.Style = GetStyle(); _savedWindowInfo.ExStyle = GetExtendedStyle(); GetWindowRect(_hwnd, out var windowRect); _savedWindowInfo.WindowRect = windowRect; - } - - _windowProperties.IsFullScreen = fullscreen; - if (_windowProperties.IsFullScreen) - { // Set new window style and size. SetStyle(_savedWindowInfo.Style & ~(WindowStyles.WS_CAPTION | WindowStyles.WS_THICKFRAME)); SetExtendedStyle(_savedWindowInfo.ExStyle & ~(WindowStyles.WS_EX_DLGMODALFRAME | WindowStyles.WS_EX_WINDOWEDGE | WindowStyles.WS_EX_CLIENTEDGE | WindowStyles.WS_EX_STATICEDGE)); @@ -635,42 +631,40 @@ namespace Avalonia.Win32 { ShowWindowCommand command; + var newWindowProperties = _windowProperties; + switch (state) { case WindowState.Minimized: - if (_windowProperties.IsFullScreen) - { - SetFullScreen(false); - } - + newWindowProperties.IsFullScreen = false; command = ShowWindowCommand.Minimize; break; case WindowState.Maximized: - if (_windowProperties.IsFullScreen) - { - SetFullScreen(false); - } - + newWindowProperties.IsFullScreen = false; command = ShowWindowCommand.Maximize; break; case WindowState.Normal: - if (_windowProperties.IsFullScreen) - { - SetFullScreen(false); - } - + newWindowProperties.IsFullScreen = false; command = ShowWindowCommand.Restore; break; case WindowState.FullScreen: - SetFullScreen(true); - return; + newWindowProperties.IsFullScreen = true; + command = ShowWindowCommand.Maximize; + break; default: throw new ArgumentException("Invalid WindowState."); } + UpdateWindowProperties(newWindowProperties); + + if (newWindowProperties.IsFullScreen) + { + return; + } + UnmanagedMethods.ShowWindow(_hwnd, command); if (state == WindowState.Maximized) @@ -800,6 +794,11 @@ namespace Avalonia.Win32 SetWindowPosFlags.SWP_NOZORDER | SetWindowPosFlags.SWP_NOACTIVATE | SetWindowPosFlags.SWP_FRAMECHANGED); } + + if (oldProperties.IsFullScreen != newProperties.IsFullScreen) + { + SetFullScreen(newProperties.IsFullScreen); + } } #if USE_MANAGED_DRAG