diff --git a/src/Avalonia.Controls/Chrome/CaptionButtons.cs b/src/Avalonia.Controls/Chrome/CaptionButtons.cs index 618c3c4fb2..99db4e550b 100644 --- a/src/Avalonia.Controls/Chrome/CaptionButtons.cs +++ b/src/Avalonia.Controls/Chrome/CaptionButtons.cs @@ -20,18 +20,6 @@ namespace Avalonia.Controls.Chrome _disposables = new CompositeDisposable { - _hostWindow.GetObservable(Window.WindowDecorationMarginsProperty) - .Subscribe(x => - { - Height = x.Top; - }), - - _hostWindow.GetObservable(Window.ExtendClientAreaTitleBarHeightHintProperty) - .Subscribe(x => InvalidateSize()), - - _hostWindow.GetObservable(Window.OffScreenMarginProperty) - .Subscribe(x => InvalidateSize()), - _hostWindow.GetObservable(Window.WindowStateProperty) .Subscribe(x => { @@ -44,12 +32,6 @@ namespace Avalonia.Controls.Chrome } } - void InvalidateSize () - { - Margin = new Thickness(1, _hostWindow.OffScreenMargin.Top, 1, 1); - Height = _hostWindow.WindowDecorationMargins.Top; - } - public void Detach() { if (_disposables != null) diff --git a/src/Avalonia.Controls/Chrome/TitleBar.cs b/src/Avalonia.Controls/Chrome/TitleBar.cs index d4ac5cd855..b0ae25892e 100644 --- a/src/Avalonia.Controls/Chrome/TitleBar.cs +++ b/src/Avalonia.Controls/Chrome/TitleBar.cs @@ -18,21 +18,6 @@ namespace Avalonia.Controls.Chrome _hostWindow = hostWindow; } - public TitleBar() - { - - } - - protected override Size MeasureOverride(Size availableSize) - { - return base.MeasureOverride(availableSize); - } - - protected override Size ArrangeOverride(Size finalSize) - { - return base.ArrangeOverride(finalSize); - } - public void Attach() { if (_disposables == null) @@ -44,10 +29,7 @@ namespace Avalonia.Controls.Chrome _disposables = new CompositeDisposable { _hostWindow.GetObservable(Window.WindowDecorationMarginsProperty) - .Subscribe(x => - { - Height = x.Top; - }), + .Subscribe(x => InvalidateSize()), _hostWindow.GetObservable(Window.ExtendClientAreaTitleBarHeightHintProperty) .Subscribe(x => InvalidateSize()), @@ -71,8 +53,16 @@ namespace Avalonia.Controls.Chrome void InvalidateSize() { - Margin = new Thickness(1, _hostWindow.OffScreenMargin.Top, 1, 1); - Height = _hostWindow.WindowDecorationMargins.Top; + Margin = new Thickness( + _hostWindow.OffScreenMargin.Left, + _hostWindow.OffScreenMargin.Top, + _hostWindow.OffScreenMargin.Right, + _hostWindow.OffScreenMargin.Bottom); + + if (_hostWindow.WindowState != WindowState.FullScreen) + { + Height = _hostWindow.WindowDecorationMargins.Top; + } } public void Detach() @@ -94,7 +84,7 @@ namespace Avalonia.Controls.Chrome { base.OnApplyTemplate(e); - _captionButtons = e.NameScope.Find("PART_CaptionButtons"); + _captionButtons = e.NameScope.Find("PART_CaptionButtons"); _captionButtons.Attach(_hostWindow); } diff --git a/src/Avalonia.Themes.Fluent/TitleBar.xaml b/src/Avalonia.Themes.Fluent/TitleBar.xaml index 5083f4c15a..db4dbe95a2 100644 --- a/src/Avalonia.Themes.Fluent/TitleBar.xaml +++ b/src/Avalonia.Themes.Fluent/TitleBar.xaml @@ -5,23 +5,27 @@ + + diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index bed6922076..5ffcc2034c 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -671,6 +671,8 @@ namespace Avalonia.Win32 } TaskBarList.MarkFullscreen(_hwnd, fullscreen); + + ExtendClientArea(); } private MARGINS UpdateExtendMargins() @@ -724,33 +726,41 @@ namespace Avalonia.Win32 { _isClientAreaExtended = false; return; - } - - GetWindowRect(_hwnd, out var rcClient); + } - // Inform the application of the frame change. - SetWindowPos(_hwnd, - IntPtr.Zero, - rcClient.left, rcClient.top, - rcClient.Width, rcClient.Height, - SetWindowPosFlags.SWP_FRAMECHANGED); - - if(_isClientAreaExtended) + if (!_isClientAreaExtended || WindowState == WindowState.FullScreen) { - var margins = UpdateExtendMargins(); - - DwmExtendFrameIntoClientArea(_hwnd, ref margins); + _extendedMargins = new Thickness(0, 0, 0, 0); + _offScreenMargin = new Thickness(); } else { - var margins = new MARGINS(); - DwmExtendFrameIntoClientArea(_hwnd, ref margins); + GetWindowRect(_hwnd, out var rcClient); - _offScreenMargin = new Thickness(); - _extendedMargins = new Thickness(); + // Inform the application of the frame change. + SetWindowPos(_hwnd, + IntPtr.Zero, + rcClient.left, rcClient.top, + rcClient.Width, rcClient.Height, + SetWindowPosFlags.SWP_FRAMECHANGED); + + if (_isClientAreaExtended) + { + var margins = UpdateExtendMargins(); + + DwmExtendFrameIntoClientArea(_hwnd, ref margins); + } + else + { + var margins = new MARGINS(); + DwmExtendFrameIntoClientArea(_hwnd, ref margins); + + _offScreenMargin = new Thickness(); + _extendedMargins = new Thickness(); + } } - ExtendClientAreaToDecorationsChanged?.Invoke(true); + ExtendClientAreaToDecorationsChanged?.Invoke(_isClientAreaExtended); } private void ShowWindow(WindowState state)