diff --git a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Windows.cs b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Windows.cs index 1bfe2081418e..07f93e1f88f3 100644 --- a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Windows.cs +++ b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.Windows.cs @@ -168,37 +168,34 @@ static void InsertContentPanel(ScrollViewer scrollViewer, IScrollView scrollView Size ICrossPlatformLayout.CrossPlatformMeasure(double widthConstraint, double heightConstraint) { - var scrollView = VirtualView; + if (VirtualView is not { } scrollView) + { + return Size.Zero; + } var padding = scrollView.Padding; - var presentedContent = scrollView.PresentedContent; - if (presentedContent == null) + if (scrollView.PresentedContent == null) { return new Size(padding.HorizontalThickness, padding.VerticalThickness); } - // Exclude the padding while measuring the internal content ... - var measurementWidth = widthConstraint - padding.HorizontalThickness; - var measurementHeight = heightConstraint - padding.VerticalThickness; - - var result = (scrollView as ICrossPlatformLayout).CrossPlatformMeasure(measurementWidth, measurementHeight); - - // ... and add the padding back in to the final result - var fullSize = new Size(result.Width + padding.HorizontalThickness, result.Height + padding.VerticalThickness); + var scrollOrientation = scrollView.Orientation; + var contentWidthConstraint = scrollOrientation is ScrollOrientation.Horizontal or ScrollOrientation.Both ? double.PositiveInfinity : widthConstraint; + var contentHeightConstraint = scrollOrientation is ScrollOrientation.Vertical or ScrollOrientation.Both ? double.PositiveInfinity : heightConstraint; + var contentSize = scrollView.MeasureContent(scrollView.Padding, contentWidthConstraint, contentHeightConstraint, !double.IsInfinity(contentWidthConstraint), !double.IsInfinity(contentHeightConstraint)); if (double.IsInfinity(widthConstraint)) { - widthConstraint = result.Width; + widthConstraint = contentSize.Width; } if (double.IsInfinity(heightConstraint)) { - heightConstraint = result.Height; + heightConstraint = contentSize.Height; } - // If the presented content has LayoutAlignment Fill, we'll need to adjust the measurement to account for that - return fullSize.AdjustForFill(new Rect(0, 0, widthConstraint, heightConstraint), presentedContent); + return contentSize.AdjustForFill(new Rect(0, 0, widthConstraint, heightConstraint), scrollView.PresentedContent); } Size ICrossPlatformLayout.CrossPlatformArrange(Rect bounds) diff --git a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.iOS.cs b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.iOS.cs index 9561c9f423ca..7b1fb9ab4063 100644 --- a/src/Core/src/Handlers/ScrollView/ScrollViewHandler.iOS.cs +++ b/src/Core/src/Handlers/ScrollView/ScrollViewHandler.iOS.cs @@ -157,7 +157,7 @@ Size ICrossPlatformLayout.CrossPlatformMeasure(double widthConstraint, double he var scrollOrientation = scrollView.Orientation; var contentWidthConstraint = scrollOrientation is ScrollOrientation.Horizontal or ScrollOrientation.Both ? double.PositiveInfinity : widthConstraint; var contentHeightConstraint = scrollOrientation is ScrollOrientation.Vertical or ScrollOrientation.Both ? double.PositiveInfinity : heightConstraint; - var contentSize = MeasureContent(scrollView, scrollView.Padding, contentWidthConstraint, contentHeightConstraint); + var contentSize = scrollView.MeasureContent(scrollView.Padding, contentWidthConstraint, contentHeightConstraint, !double.IsInfinity(contentWidthConstraint), !double.IsInfinity(contentHeightConstraint)); // Our target size is the smaller of it and the constraints var width = contentSize.Width <= widthConstraint ? contentSize.Width : widthConstraint; @@ -169,31 +169,6 @@ Size ICrossPlatformLayout.CrossPlatformMeasure(double widthConstraint, double he return new Size(width, height); } - static Size MeasureContent(IContentView contentView, Thickness inset, double widthConstraint, double heightConstraint) - { - var content = contentView.PresentedContent; - - var contentSize = Size.Zero; - - if (!double.IsInfinity(widthConstraint) && Dimension.IsExplicitSet(contentView.Width)) - { - widthConstraint = contentView.Width; - } - - if (!double.IsInfinity(heightConstraint) && Dimension.IsExplicitSet(contentView.Height)) - { - heightConstraint = contentView.Height; - } - - if (content is not null) - { - contentSize = content.Measure(widthConstraint - inset.HorizontalThickness, - heightConstraint - inset.VerticalThickness); - } - - return new Size(contentSize.Width + inset.HorizontalThickness, contentSize.Height + inset.VerticalThickness); - } - Size ICrossPlatformLayout.CrossPlatformArrange(Rect bounds) { return (VirtualView as ICrossPlatformLayout)?.CrossPlatformArrange(bounds) ?? Size.Zero;