diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index 1d6c61e1b4..c256e99251 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -421,10 +421,12 @@ namespace Avalonia.Controls { PlatformImpl.WindowState = value; var oldValue = _windowStateForPropertyNotifications; - _windowStateForPropertyNotifications = PlatformImpl.WindowState; // If the request was refused - trigger a synthetic property change if (PlatformImpl.WindowState != value) + { + _windowStateForPropertyNotifications = PlatformImpl.WindowState; RaisePropertyChanged(WindowStateProperty, oldValue, _windowStateForPropertyNotifications); + } } } } diff --git a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs index 541addc780..e69a0226c4 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs @@ -739,7 +739,8 @@ namespace Avalonia.Win32 _ => WindowState.Normal, }; - var stateChanged = windowState != _lastWindowState; + var stateChanged = windowState != _lastWindowState + || windowState != _effectiveWindowState; _lastWindowState = windowState; if (Resized != null && diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 6c66fd69e3..ed1690ab39 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -95,7 +95,10 @@ namespace Avalonia.Win32 private double _scaling = 1; private uint _dpi = 96; private WindowState _showWindowState; + // Window state, set from various places in code private WindowState _lastWindowState; + // Window state, set exclusively from WM_SIZE handler before triggering the state change event + private WindowState? _effectiveWindowState; private OleDropTarget? _dropTarget; private Size _minSize; private Size _maxSize; @@ -207,8 +210,7 @@ namespace Avalonia.Win32 public Action? ScalingChanged { get; set; } public Action? PositionChanged { get; set; } - - private WindowState? _effectiveWindowState; + public Action? WindowStateChanged { get; set; } public Action? LostFocus { get; set; }