Browse Source

Merge pull request #11916 from MrJul/fixes/scrollcontentpresenter-margin-rounding

Fix ScrollContentPresenter's child margin with layout rounding
pull/11928/head
Max Katz 3 years ago
committed by GitHub
parent
commit
1b9d767bcb
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 12
      src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs
  2. 31
      tests/Avalonia.Controls.UnitTests/Presenters/ScrollContentPresenterTests.cs

12
src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs

@ -7,7 +7,7 @@ using Avalonia.Input.GestureRecognizers;
using Avalonia.Utilities;
using Avalonia.VisualTree;
using System.Linq;
using Avalonia.Interactivity;
using Avalonia.Layout;
namespace Avalonia.Controls.Presenters
{
@ -473,7 +473,15 @@ namespace Avalonia.Controls.Presenters
}
Viewport = finalSize;
Extent = Child!.Bounds.Size.Inflate(Child.Margin);
var childMargin = Child!.Margin;
if (Child.UseLayoutRounding)
{
var scale = LayoutHelper.GetLayoutScale(Child);
childMargin = LayoutHelper.RoundLayoutThickness(childMargin, scale, scale);
}
Extent = Child!.Bounds.Size.Inflate(childMargin);
_isAnchorElementDirty = true;
return finalSize;

31
tests/Avalonia.Controls.UnitTests/Presenters/ScrollContentPresenterTests.cs

@ -4,6 +4,7 @@ using System.Reactive.Linq;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Primitives;
using Avalonia.Layout;
using Avalonia.UnitTests;
using Xunit;
namespace Avalonia.Controls.UnitTests.Presenters
@ -244,6 +245,36 @@ namespace Avalonia.Controls.UnitTests.Presenters
Assert.Equal(new Size(110, 110), target.Extent);
}
[Fact]
public void Extent_Should_Include_Content_Margin_Scaled_With_Layout_Rounding()
{
var root = new TestRoot
{
LayoutScaling = 1.25,
UseLayoutRounding = true
};
var target = new ScrollContentPresenter
{
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center,
Content = new Border
{
Width = 200,
Height = 200,
Margin = new Thickness(2)
}
};
root.Child = target;
target.UpdateChild();
target.Measure(new Size(1000, 1000));
target.Arrange(new Rect(0, 0, 1000, 1000));
Assert.Equal(new Size(203.2, 203.2), target.Viewport);
Assert.Equal(new Size(203.2, 203.2), target.Extent);
}
[Fact]
public void Extent_Width_Should_Be_Arrange_Width_When_CanScrollHorizontally_False()
{

Loading…
Cancel
Save