Enhance TitleBar and CaptionButtons to respect latest Window.CanMaximize and Window.CanMinimize (#815)

* fix: enhance window resizing logic to include maximization check

* fix: update CaptionButtons to control button visibility based on window properties

* fix: update obsolescence messages for minimize and restore button properties

* chore: update comment.
This commit is contained in:
Dong Bin
2025-11-14 13:32:27 +08:00
committed by GitHub
parent d0fc4098dd
commit 0f1a00f388
4 changed files with 187 additions and 50 deletions

View File

@@ -0,0 +1,140 @@
using Avalonia.Controls;
using Avalonia.Headless.XUnit;
using Avalonia.VisualTree;
using Ursa.Controls;
namespace HeadlessTest.Ursa.Controls.CaptionButtonsTests;
public class Test
{
[AvaloniaTheory]
[InlineData(true, true)]
[InlineData(false, false)]
public void UrsaWindow_IsRestoreButtonVisible_Should_Control_RestoreButton_Visibility(bool canMaximize, bool expectedVisibility)
{
var window = new UrsaWindow();
var caption = new CaptionButtons();
window.Content = caption;
caption.Attach(window);
window.Show();
window.IsRestoreButtonVisible = canMaximize;
var restoreButton = caption.GetVisualDescendants().OfType<Button>().FirstOrDefault(b => b.Name == "PART_RestoreButton");
Assert.NotNull(restoreButton);
Assert.Equal(expectedVisibility, restoreButton.IsVisible);
window.IsRestoreButtonVisible = !canMaximize;
Assert.Equal(!expectedVisibility, restoreButton.IsVisible);
}
[AvaloniaTheory]
[InlineData(true, true)]
[InlineData(false, false)]
public void UrsaWindow_IsMinimizeButtonVisible_Should_Control_MinimizeButton_Visibility(bool canMinimize, bool expectedVisibility)
{
var window = new UrsaWindow();
var caption = new CaptionButtons();
window.Content = caption;
caption.Attach(window);
window.Show();
window.IsMinimizeButtonVisible = canMinimize;
var minimizeButton = caption.GetVisualDescendants().OfType<Button>().FirstOrDefault(b => b.Name == "PART_MinimizeButton");
Assert.NotNull(minimizeButton);
Assert.Equal(expectedVisibility, minimizeButton.IsVisible);
window.IsMinimizeButtonVisible = !canMinimize;
Assert.Equal(!expectedVisibility, minimizeButton.IsVisible);
}
[AvaloniaTheory]
[InlineData(true, true)]
[InlineData(false, false)]
public void UrsaWindow_IsCloseButtonVisible_Should_Control_CloseButton_Visibility(bool isVisible,
bool expectedVisibility)
{
var window = new UrsaWindow();
var caption = new CaptionButtons();
window.Content = caption;
caption.Attach(window);
window.Show();
window.IsCloseButtonVisible = isVisible;
var closeButton = caption.GetVisualDescendants().OfType<Button>()
.FirstOrDefault(b => b.Name == "PART_CloseButton");
Assert.NotNull(closeButton);
Assert.Equal(expectedVisibility, closeButton.IsVisible);
window.IsCloseButtonVisible = !isVisible;
Assert.Equal(!expectedVisibility, closeButton.IsVisible);
}
[AvaloniaTheory]
[InlineData(true, true)]
[InlineData(false, false)]
public void UrsaWindow_IsFullScreenButtonVisible_Should_Control_FullScreenButton_Visibility
(bool isVisible,
bool expectedVisibility)
{
var window = new UrsaWindow();
var caption = new CaptionButtons();
window.Content = caption;
caption.Attach(window);
window.Show();
window.IsFullScreenButtonVisible = isVisible;
var fullScreenButton = caption.GetVisualDescendants().OfType<Button>()
.FirstOrDefault(b => b.Name == "PART_FullScreenButton");
Assert.NotNull(fullScreenButton);
Assert.Equal(expectedVisibility, fullScreenButton.IsVisible);
window.IsFullScreenButtonVisible = !isVisible;
Assert.Equal(!expectedVisibility, fullScreenButton.IsVisible);
}
[AvaloniaTheory]
[InlineData(WindowState.Normal)]
[InlineData(WindowState.Maximized)]
public void CaptionButtons_ToggleFullScreen_Should_Set_WindowState(WindowState initialState)
{
var window = new UrsaWindow();
var caption = new CaptionButtons();
window.Content = caption;
caption.Attach(window);
window.Show();
window.WindowState = initialState;
var fullScreenButton = caption.GetVisualDescendants().OfType<Button>()
.FirstOrDefault(b => b.Name == "PART_FullScreenButton");
Assert.NotNull(fullScreenButton);
fullScreenButton.RaiseEvent(new Avalonia.Interactivity.RoutedEventArgs(Button.ClickEvent));
Assert.Equal(WindowState.FullScreen, window.WindowState);
fullScreenButton.RaiseEvent(new Avalonia.Interactivity.RoutedEventArgs(Button.ClickEvent));
Assert.Equal(initialState, window.WindowState);
}
[AvaloniaTheory]
[InlineData(true, true)]
[InlineData(false, false)]
public void Window_CanMaximize_Should_Update_RestoreButton_Visibility(bool canMaximize, bool expectedVisibility)
{
var window = new UrsaWindow();
var caption = new CaptionButtons();
window.Content = caption;
caption.Attach(window);
window.Show();
window.CanMaximize = canMaximize;
var restoreButton = caption.GetVisualDescendants().OfType<Button>()
.FirstOrDefault(b => b.Name == "PART_RestoreButton");
Assert.NotNull(restoreButton);
Assert.Equal(expectedVisibility, restoreButton.IsVisible);
}
[AvaloniaTheory]
[InlineData(true, true)]
[InlineData(false, false)]
public void Window_CanMinimize_Should_Update_MinimizeButton_Visibility(bool canMinimize , bool expectedVisibility)
{
var window = new UrsaWindow();
var caption = new CaptionButtons();
window.Content = caption;
caption.Attach(window);
window.Show();
window.CanMinimize = canMinimize;
var minimizeButton = caption.GetVisualDescendants().OfType<Button>()
.FirstOrDefault(b => b.Name == "PART_MinimizeButton");
Assert.NotNull(minimizeButton);
Assert.Equal(expectedVisibility, minimizeButton.IsVisible);
}
}