Skip to content
Merged
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
34 changes: 22 additions & 12 deletions src/Controls/src/Core/Layout/FlexLayout.cs
Original file line number Diff line number Diff line change
Expand Up @@ -497,22 +497,32 @@ void AddFlexItem(int index, IView child)
{
item.SelfSizing = (Flex.Item it, ref float w, ref float h) =>
{
var sizeConstraints = item.GetConstraints();
Size request;

sizeConstraints.Width = (InMeasureMode && sizeConstraints.Width == 0) ? double.PositiveInfinity : sizeConstraints.Width;
sizeConstraints.Height = (InMeasureMode && sizeConstraints.Height == 0) ? double.PositiveInfinity : sizeConstraints.Height;

if (child is Image)
if (InMeasureMode)
{
// This is a hack to get FlexLayout to behave like it did in Forms
// Forms always did its initial image measure unconstrained, which would return
// the intrinsic size of the image (no scaling or aspect ratio adjustments)
var sizeConstraints = item.GetConstraints();

sizeConstraints.Width = double.PositiveInfinity;
sizeConstraints.Height = double.PositiveInfinity;
}
sizeConstraints.Width = (InMeasureMode && sizeConstraints.Width == 0) ? double.PositiveInfinity : sizeConstraints.Width;
sizeConstraints.Height = (InMeasureMode && sizeConstraints.Height == 0) ? double.PositiveInfinity : sizeConstraints.Height;

if (child is Image)
{
// This is a hack to get FlexLayout to behave like it did in Forms
// Forms always did its initial image measure unconstrained, which would return
// the intrinsic size of the image (no scaling or aspect ratio adjustments)

sizeConstraints.Width = double.PositiveInfinity;
sizeConstraints.Height = double.PositiveInfinity;
}

var request = child.Measure(sizeConstraints.Width, sizeConstraints.Height);
request = child.Measure(sizeConstraints.Width, sizeConstraints.Height);
}
else
{
// Arrange pass, do not ever run a measure here!
request = child.DesiredSize;
}
w = (float)request.Width;
h = (float)request.Height;
};
Expand Down
15 changes: 6 additions & 9 deletions src/Controls/tests/Core.UnitTests/Layouts/FlexLayoutTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,7 @@ public void FlexLayoutMeasuresImagesUnconstrained()
root.Add(flexLayout);
flexLayout.Add(image as IView);

var manager = new FlexLayoutManager(flexLayout);
_ = manager.Measure(1000, 1000);
flexLayout.CrossPlatformMeasure(1000, 1000);

Assert.True(image.Passed, "Image should be measured unconstrained even if the FlexLayout is constrained.");
}
Expand All @@ -61,21 +60,19 @@ public void FlexLayoutRecognizesVisibilityChange()
flexLayout.Add(view as IView);
flexLayout.Add(view2 as IView);

var manager = new FlexLayoutManager(flexLayout);

// Measure and arrange the layout while the first view is visible
var measure = manager.Measure(1000, 1000);
manager.ArrangeChildren(new Rect(Point.Zero, measure));
var measure = flexLayout.CrossPlatformMeasure(1000, 1000);
flexLayout.CrossPlatformArrange(new Rect(Point.Zero, measure));

// Keep track of where the second view is arranged
var whenVisible = view2.Frame.X;

// Change the visibility
view.IsVisible = false;

// Measure and arrange againg
measure = manager.Measure(1000, 1000);
manager.ArrangeChildren(new Rect(Point.Zero, measure));
// Measure and arrange again
measure = flexLayout.CrossPlatformMeasure(1000, 1000);
flexLayout.CrossPlatformArrange(new Rect(Point.Zero, measure));

var whenInvisible = view2.Frame.X;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using NUnit.Framework;
using UITest.Appium;
using UITest.Core;

namespace Microsoft.Maui.TestCases.Tests.Issues
{
public class Issue20696 : _IssuesUITest
{
public override string Issue => "[iOS] FlyoutHeader does not change its size after adding new content";

public Issue20696(TestDevice device) : base(device)
{
}

#if IOS
[Test]
#endif
public void FlyoutHeaderShouldBeResized()
{
_ = App.WaitForElement("GoToTest");
App.Tap("GoToTest");

_ = App.WaitForElement("button");
App.Tap("button");

//The test passes if the second button is visible in the flyout header
_ = App.WaitForElement("TestButton2");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using NUnit.Framework;
using UITest.Appium;
using UITest.Core;

namespace Microsoft.Maui.TestCases.Tests.Issues;

public class Issue9075 : _IssuesUITest
{
public override string Issue => "FlexLayout trigger Cycle GUI exception";

public Issue9075(TestDevice device)
: base(device)
{ }

#if WINDOWS
[Test]
[Category(UITestCategories.Layout)]
#endif
public void FlexLayoutCycleException()
{
App.WaitForElement("Item2");

// Without exceptions, the test has passed.
}
}
78 changes: 78 additions & 0 deletions src/Controls/tests/TestCases/Issues/Issue9075.xaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Maui.Controls.Sample.Issues.Issue9075">
<ScrollView>
<Grid
BackgroundColor="LightCoral">
<Grid.RowDefinitions>
<RowDefinition Height="410"/>
<RowDefinition Height="60"/>
</Grid.RowDefinitions>
<CarouselView
ItemsSource="{Binding CarouselGrids}"
IndicatorView="indic"
HorizontalOptions="Center"
VerticalOptions="Center"
HeightRequest="400"
Loop="False"
BackgroundColor="PaleGoldenrod">
<CarouselView.ItemTemplate>
<DataTemplate>
<Grid>
<Border
Margin="10,0,10,10"
Stroke="Blue"
HeightRequest="300"
WidthRequest="300"
Background="WhiteSmoke"
StrokeThickness="8"
StrokeShape="RoundRectangle 5">
<Border.Shadow>
<Shadow
Brush="Black"
Offset="10,10"
Radius="20"
Opacity="0.8"/>
</Border.Shadow>
<CollectionView ItemsSource="{Binding}">
<CollectionView.ItemTemplate>
<DataTemplate>
<FlexLayout>
<Border
Margin="1"
Stroke="Red"
HeightRequest="30"
WidthRequest="30"
Background="WhiteSmoke"
StrokeThickness="2">
<Label
Text="{Binding}"
AutomationId="{Binding}"
TextColor="Red"
FontSize="12"
FontAttributes="Bold"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center"/>
</Border>
</FlexLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</Border>
</Grid>
</DataTemplate>
</CarouselView.ItemTemplate>
</CarouselView>
<IndicatorView
Grid.Row="1"
HorizontalOptions="Center"
IndicatorSize="22"
IndicatorsShape="Circle"
IndicatorColor="Gainsboro"
SelectedIndicatorColor="#006EFF"
x:Name="indic" />
</Grid>
</ScrollView>
</ContentPage>
60 changes: 60 additions & 0 deletions src/Controls/tests/TestCases/Issues/Issue9075.xaml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
using System.Collections.ObjectModel;
using Microsoft.Maui.Controls.Internals;
using Microsoft.Maui.Controls;
using System.Collections.Generic;
using System.Linq;

namespace Maui.Controls.Sample.Issues
{
[Issue(IssueTracker.None, 9075, "FlexLayout trigger Cycle GUI exception", PlatformAffected.UWP)]
public partial class Issue9075 : ContentPage
{
public Issue9075()
{
InitializeComponent();

BindingContext = new Issue9075ViewModel();
}
}

[Preserve(AllMembers = true)]
public partial class Issue9075ViewModel : BindableObject
{
List<int> _carouselCards = new()
{
49,
12,
50,
10,
25,
9,
99,
77
};

ObservableCollection<ObservableCollection<string>> _carouselGrids = new();

public ObservableCollection<ObservableCollection<string>> CarouselGrids
{
get => _carouselGrids;
set
{
_carouselGrids = value;
OnPropertyChanged();
}
}

public Issue9075ViewModel()
{
_InitGrids();
}

private void _InitGrids()
{
foreach (var card in _carouselCards)
{
_carouselGrids.Add(new ObservableCollection<string>(Enumerable.Range(1, card).Select(x=> $"Item{x}")));
}
}
}
}
37 changes: 0 additions & 37 deletions src/Controls/tests/UITests/Tests/Issues/Issue20696.cs

This file was deleted.