From 05fc61d92fa0f440092fc57aad13f97ffebcf79e Mon Sep 17 00:00:00 2001 From: chinboy Date: Tue, 29 Jul 2025 14:54:27 +0800 Subject: [PATCH] Fix fullscreen bug --- .../Chrome/CaptionButtonGroup.cs | 28 +++++++++---------- .../FullScreenButtonVisibleConverter.cs | 18 ++++++++++++ .../Chrome/Themes/CaptionButtonGroup.axaml | 12 ++++++-- src/AtomUI.Controls/Window/Window.cs | 16 +++++------ 4 files changed, 50 insertions(+), 24 deletions(-) create mode 100644 src/AtomUI.Controls/Chrome/Converters/FullScreenButtonVisibleConverter.cs diff --git a/src/AtomUI.Controls/Chrome/CaptionButtonGroup.cs b/src/AtomUI.Controls/Chrome/CaptionButtonGroup.cs index 16a8dfa93..c55830daa 100644 --- a/src/AtomUI.Controls/Chrome/CaptionButtonGroup.cs +++ b/src/AtomUI.Controls/Chrome/CaptionButtonGroup.cs @@ -14,16 +14,16 @@ public class CaptionButtonGroup : TemplatedControl #region 公共属性定义 public static readonly StyledProperty IsFullScreenEnabledProperty = - AvaloniaProperty.Register(nameof(IsFullScreenEnabled), true); - + Window.IsFullScreenEnabledProperty.AddOwner(); + public static readonly StyledProperty IsMaximizeEnabledProperty = - AvaloniaProperty.Register(nameof(IsMaximizeEnabled), defaultValue: true); - + Window.IsMaximizeEnabledProperty.AddOwner(); + public static readonly StyledProperty IsMinimizeEnabledProperty = - AvaloniaProperty.Register(nameof(IsMinimizeEnabled), defaultValue: true); - + Window.IsMinimizeEnabledProperty.AddOwner(); + public static readonly StyledProperty IsPinEnabledProperty = - AvaloniaProperty.Register(nameof(IsPinEnabled), true); + Window.IsPinEnabledProperty.AddOwner(); public static readonly StyledProperty IsWindowActiveProperty = TitleBar.IsWindowActiveProperty.AddOwner(); @@ -143,7 +143,11 @@ public class CaptionButtonGroup : TemplatedControl return; } - HostWindow = hostWindow; + HostWindow = hostWindow; + this[!IsFullScreenEnabledProperty] = hostWindow[!IsFullScreenEnabledProperty]; + this[!IsPinEnabledProperty] = hostWindow[!IsPinEnabledProperty]; + this[!IsMaximizeEnabledProperty] = hostWindow[!IsMaximizeEnabledProperty]; + this[!IsMinimizeEnabledProperty] = hostWindow[!IsMinimizeEnabledProperty]; _disposables = new CompositeDisposable { HostWindow.GetObservable(Window.WindowStateProperty) @@ -229,15 +233,11 @@ public class CaptionButtonGroup : TemplatedControl return; } - if (!_isWindowFullScreen) + if (!IsWindowFullScreen) { _originWindowState = HostWindow.WindowState; } - else - { - HostWindow.WindowState = WindowState.FullScreen; - } - HostWindow.WindowState = _isWindowFullScreen + HostWindow.WindowState = IsWindowFullScreen ? _originWindowState ?? WindowState.Normal : WindowState.FullScreen; IsWindowFullScreen = HostWindow.WindowState == WindowState.FullScreen; diff --git a/src/AtomUI.Controls/Chrome/Converters/FullScreenButtonVisibleConverter.cs b/src/AtomUI.Controls/Chrome/Converters/FullScreenButtonVisibleConverter.cs new file mode 100644 index 000000000..1b4e6ac83 --- /dev/null +++ b/src/AtomUI.Controls/Chrome/Converters/FullScreenButtonVisibleConverter.cs @@ -0,0 +1,18 @@ +using System.Globalization; +using Avalonia.Data.Converters; + +namespace AtomUI.Controls.Converters; + +internal class FullScreenButtonVisibleConverter : IMultiValueConverter +{ + public object? Convert(IList values, Type targetType, object? parameter, CultureInfo culture) + { + if (values.Count != 2) + { + return false; + } + var isFullScreenEnabled = values[0] as bool?; + var isMaximized = values[1] as bool?; + return isFullScreenEnabled == true && isMaximized != true; + } +} \ No newline at end of file diff --git a/src/AtomUI.Controls/Chrome/Themes/CaptionButtonGroup.axaml b/src/AtomUI.Controls/Chrome/Themes/CaptionButtonGroup.axaml index f6b99bd7f..603a3bde4 100644 --- a/src/AtomUI.Controls/Chrome/Themes/CaptionButtonGroup.axaml +++ b/src/AtomUI.Controls/Chrome/Themes/CaptionButtonGroup.axaml @@ -6,19 +6,27 @@ x:ClassModifier="internal"> + + IsChecked="{TemplateBinding IsWindowFullScreen}"> + + + + + + + IsTitleBarVisibleProperty = AvaloniaProperty.Register(nameof(IsTitleBarVisible), defaultValue: true); @@ -40,16 +40,16 @@ public class Window : AvaloniaWindow, IDisposable TitleBar.LogoProperty.AddOwner(); public static readonly StyledProperty IsFullScreenEnabledProperty = - CaptionButtonGroup.IsFullScreenEnabledProperty.AddOwner(); - + AvaloniaProperty.Register(nameof(IsFullScreenEnabled)); + public static readonly StyledProperty IsMaximizeEnabledProperty = - CaptionButtonGroup.IsMaximizeEnabledProperty.AddOwner(); - + AvaloniaProperty.Register(nameof(IsMaximizeEnabled), defaultValue: true); + public static readonly StyledProperty IsMinimizeEnabledProperty = - CaptionButtonGroup.IsMinimizeEnabledProperty.AddOwner(); - + AvaloniaProperty.Register(nameof(IsMinimizeEnabled), defaultValue: true); + public static readonly StyledProperty IsPinEnabledProperty = - CaptionButtonGroup.IsPinEnabledProperty.AddOwner(); + AvaloniaProperty.Register(nameof(IsPinEnabled)); public static readonly StyledProperty IsMoveEnabledProperty = AvaloniaProperty.Register(nameof(IsMoveEnabled), defaultValue: true);