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