diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index 16ee3a46b3..91d6c874d3 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -214,7 +214,9 @@ namespace Avalonia.Controls } /// - /// Enables or disables resizing of the window + /// Enables or disables resizing of the window. + /// Note that if is set to False then this property + /// has no effect and should be treated as a recommendation for the user setting HasSystemDecorations. /// public bool CanResize { diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index cf6cb40e58..be28b64c5a 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -245,19 +245,13 @@ namespace Avalonia.Win32 return; } - var style = (UnmanagedMethods.WindowStyles)UnmanagedMethods.GetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_STYLE); + var style = (UnmanagedMethods.WindowStyles)UnmanagedMethods.GetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_STYLE); - var systemDecorationStyles = UnmanagedMethods.WindowStyles.WS_OVERLAPPED - | UnmanagedMethods.WindowStyles.WS_CAPTION - | UnmanagedMethods.WindowStyles.WS_SYSMENU - | UnmanagedMethods.WindowStyles.WS_MINIMIZEBOX - | UnmanagedMethods.WindowStyles.WS_MAXIMIZEBOX; - - style |= systemDecorationStyles; + style |= UnmanagedMethods.WindowStyles.WS_OVERLAPPEDWINDOW; if (!value) { - style ^= systemDecorationStyles; + style ^= UnmanagedMethods.WindowStyles.WS_OVERLAPPEDWINDOW; } UnmanagedMethods.RECT windowRect; @@ -293,6 +287,21 @@ namespace Avalonia.Win32 UnmanagedMethods.SetWindowPosFlags.SWP_NOZORDER | UnmanagedMethods.SetWindowPosFlags.SWP_NOACTIVATE); _decorated = value; + + if(_decorated) + { + if (_resizable) + { + // If we switch decorations back on we need to restore WS_SizeFrame. + _resizable = false; + CanResize(true); + } + else + { + _resizable = true; + CanResize(false); + } + } } public void Invalidate(Rect rect) @@ -863,14 +872,18 @@ namespace Avalonia.Win32 return; } - var style = (UnmanagedMethods.WindowStyles)UnmanagedMethods.GetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_STYLE); - - if (value) - style |= UnmanagedMethods.WindowStyles.WS_SIZEFRAME; - else - style &= ~(UnmanagedMethods.WindowStyles.WS_SIZEFRAME); - - UnmanagedMethods.SetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_STYLE, (uint)style); + if (_decorated) + { + var style = (UnmanagedMethods.WindowStyles)UnmanagedMethods.GetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_STYLE); + + if (value) + style |= UnmanagedMethods.WindowStyles.WS_SIZEFRAME; + else + style &= ~(UnmanagedMethods.WindowStyles.WS_SIZEFRAME); + + UnmanagedMethods.SetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_STYLE, (uint)style); + } + _resizable = value; } }