From c6ea5a393a4b11b0ce0b874d942406c10d80e34f Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Mon, 23 Mar 2026 23:33:46 +0300 Subject: [PATCH] Not-really settable property is a cursed concept --- src/Avalonia.Controls/Window.cs | 4 +++- src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs | 3 ++- src/Windows/Avalonia.Win32/WindowImpl.cs | 6 ++++-- 3 files changed, 9 insertions(+), 4 deletions(-) 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; }