Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/Avalonia.Base/Layout/Layoutable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -545,6 +545,8 @@ protected virtual Size MeasureCore(Size availableSize)
{
if (IsVisible)
{
ApplyStyling();
if (!IsVisible) return new Size();
var margin = Margin;
var useLayoutRounding = UseLayoutRounding;
var scale = 1.0;
Expand All @@ -555,7 +557,6 @@ protected virtual Size MeasureCore(Size availableSize)
margin = LayoutHelper.RoundLayoutThickness(margin, scale);
}

ApplyStyling();
ApplyTemplate();

var minMax = new MinMax(this);
Expand Down
5 changes: 3 additions & 2 deletions src/Avalonia.Controls/StackPanel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -261,15 +261,16 @@ protected override Size MeasureOverride(Size availableSize)
// Get next child.
var child = children[i];

// Measure the child.
child.Measure(layoutSlotSize);

bool isVisible = child.IsVisible;

if (isVisible && !hasVisibleChild)
{
hasVisibleChild = true;
}

// Measure the child.
child.Measure(layoutSlotSize);
Size childDesiredSize = child.DesiredSize;

// Accumulate child size.
Expand Down
77 changes: 77 additions & 0 deletions tests/Avalonia.Controls.UnitTests/WindowTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1642,6 +1642,83 @@ public void WindowDecorationsTheme_Should_Apply_To_Decorations()
}
}

[Fact]
public void IsVisible_Setter_Should_Affect_Measurements_Inside_WindowDrawnDecorationsContent()
{
using var app = UnitTestApplication.Start(TestServices.StyledWindow);

var windowImpl = MockWindowingPlatform.CreateWindowMock();
windowImpl.Setup(x => x.NeedsManagedDecorations).Returns(true);
windowImpl.Setup(x => x.RequestedDrawnDecorations).Returns(PlatformRequestedDrawnDecoration.TitleBar);

var window = new Window(windowImpl.Object);

var stackPanel = new StackPanel
{
Width = 32,
Spacing = 2,
Children =
{
new Control { Height = 32 },
new Control
{
Height = 32,
Classes = { "hidden-by-style" }
},
}
};

var contentControl = new ContentControl
{
Content = new Control
{
Height = 32,
Width = 32,
Classes = { "hidden-by-style" }
}
};

var content = new WindowDrawnDecorationsContent
{
Overlay = new ContentControl
{
Content = new Panel
{
Children = { stackPanel, contentControl }
}
}
};

var template = new WindowDrawnDecorationsTemplate
{
Content = (IServiceProvider? _) => new TemplateResult<WindowDrawnDecorationsContent>(content, new NameScope())
};

var theme = new ControlTheme(typeof(WindowDrawnDecorations))
{
Setters =
{
new Setter(WindowDrawnDecorations.TemplateProperty, template)
}
};

var style = new Style(x => x.Is<WindowDrawnDecorations>().Template().OfType<Control>().Class("hidden-by-style"))
{
Setters =
{
new Setter(Visual.IsVisibleProperty, false)
}
};

window.WindowDecorationsTheme = theme;
window.Styles.Add(style);
window.Show();
window.Measure(Size.Infinity);

Assert.Equal(new Size(), contentControl.DesiredSize);
Assert.Equal(new Size(32, 32), stackPanel.DesiredSize);
}

private class TopmostWindow : Window
{
static TopmostWindow()
Expand Down