1+ using System . Text . RegularExpressions ;
2+
3+ namespace Maui . Controls . Sample . Issues ;
4+
5+ [ Issue ( IssueTracker . Github , 25671 , "Layout passes should not increase" , PlatformAffected . All ) ]
6+
7+ public partial class Issue25671 : ContentPage
8+ {
9+ public static long MeasurePasses = 0 ;
10+ public static long ArrangePasses = 0 ;
11+
12+ private int _regenIndex = 2 ;
13+ private static readonly string _loremIpsumLongText = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue." ;
14+ private static readonly string [ ] _words = new Regex ( @"\w+" ) . Matches ( _loremIpsumLongText ) . Select ( m => m . Value ) . ToArray ( ) ;
15+
16+ public Issue25671 ( )
17+ {
18+ InitializeComponent ( ) ;
19+ GenerateItems ( ) ;
20+ }
21+
22+ void RegenerateItems ( object sender , EventArgs args )
23+ {
24+ _regenIndex = ( _regenIndex - 1 ) % 4 + 2 ;
25+ GenerateItems ( ) ;
26+ }
27+
28+ void OnClick ( object sender , EventArgs args )
29+ {
30+ ( ( Button ) sender ) . Text = $ "M: { MeasurePasses } , A: { ArrangePasses } ";
31+ }
32+
33+ void GenerateItems ( )
34+ {
35+ CV . ItemsSource = Enumerable . Range ( 4 , 200 ) . Select ( i =>
36+ new
37+ {
38+ Text = string . Join ( ' ' , _words . Take ( i % _regenIndex == 0 ? i % _words . Length : ( i * 2 ) % _words . Length ) ) ,
39+ Glyph = char . ConvertFromUtf32 ( 0xf127 + i % 10 )
40+ } ) ;
41+ }
42+ }
43+
44+ #if IOS
45+ // When CV2 is completed and can handle resize of items we can remove this pointer to CV1
46+ internal class Issue25671CollectionView : CollectionView1
47+ #else
48+ public class Issue25671CollectionView : CollectionView
49+ #endif
50+ {
51+ }
52+
53+ public class Issue25671AbsoluteLayout : AbsoluteLayout
54+ {
55+ public static long MeasurePasses = 0 ;
56+ public static long ArrangePasses = 0 ;
57+
58+ protected override Size ArrangeOverride ( Rect bounds )
59+ {
60+ Interlocked . Increment ( ref Issue25671 . ArrangePasses ) ;
61+ Interlocked . Increment ( ref ArrangePasses ) ;
62+ return base . ArrangeOverride ( bounds ) ;
63+ }
64+
65+ protected override Size MeasureOverride ( double widthConstraint , double heightConstraint )
66+ {
67+ Interlocked . Increment ( ref Issue25671 . MeasurePasses ) ;
68+ Interlocked . Increment ( ref MeasurePasses ) ;
69+ return base . MeasureOverride ( widthConstraint , heightConstraint ) ;
70+ }
71+ }
72+
73+ public class Issue25671VerticalStackLayout : VerticalStackLayout
74+ {
75+ public static long MeasurePasses = 0 ;
76+ public static long ArrangePasses = 0 ;
77+
78+ protected override Size ArrangeOverride ( Rect bounds )
79+ {
80+ Interlocked . Increment ( ref Issue25671 . ArrangePasses ) ;
81+ Interlocked . Increment ( ref ArrangePasses ) ;
82+ return base . ArrangeOverride ( bounds ) ;
83+ }
84+
85+ protected override Size MeasureOverride ( double widthConstraint , double heightConstraint )
86+ {
87+ Interlocked . Increment ( ref Issue25671 . MeasurePasses ) ;
88+ Interlocked . Increment ( ref MeasurePasses ) ;
89+ return base . MeasureOverride ( widthConstraint , heightConstraint ) ;
90+ }
91+ }
92+
93+ public class Issue25671Grid : Grid
94+ {
95+ public static long MeasurePasses = 0 ;
96+ public static long ArrangePasses = 0 ;
97+
98+ protected override Size ArrangeOverride ( Rect bounds )
99+ {
100+ Interlocked . Increment ( ref Issue25671 . ArrangePasses ) ;
101+ Interlocked . Increment ( ref ArrangePasses ) ;
102+ return base . ArrangeOverride ( bounds ) ;
103+ }
104+
105+ protected override Size MeasureOverride ( double widthConstraint , double heightConstraint )
106+ {
107+ Interlocked . Increment ( ref Issue25671 . MeasurePasses ) ;
108+ Interlocked . Increment ( ref MeasurePasses ) ;
109+ return base . MeasureOverride ( widthConstraint , heightConstraint ) ;
110+ }
111+ }
112+
113+ public class Issue25671ContentView : ContentView
114+ {
115+ public static long MeasurePasses = 0 ;
116+ public static long ArrangePasses = 0 ;
117+
118+ protected override Size ArrangeOverride ( Rect bounds )
119+ {
120+ Interlocked . Increment ( ref Issue25671 . ArrangePasses ) ;
121+ Interlocked . Increment ( ref ArrangePasses ) ;
122+ return base . ArrangeOverride ( bounds ) ;
123+ }
124+
125+ protected override Size MeasureOverride ( double widthConstraint , double heightConstraint )
126+ {
127+ Interlocked . Increment ( ref Issue25671 . MeasurePasses ) ;
128+ Interlocked . Increment ( ref MeasurePasses ) ;
129+ return base . MeasureOverride ( widthConstraint , heightConstraint ) ;
130+ }
131+ }
132+
133+ public class Issue25671Label : Label
134+ {
135+ public static long MeasurePasses = 0 ;
136+ public static long ArrangePasses = 0 ;
137+
138+ protected override Size ArrangeOverride ( Rect bounds )
139+ {
140+ Interlocked . Increment ( ref Issue25671 . ArrangePasses ) ;
141+ Interlocked . Increment ( ref ArrangePasses ) ;
142+ return base . ArrangeOverride ( bounds ) ;
143+ }
144+
145+ protected override Size MeasureOverride ( double widthConstraint , double heightConstraint )
146+ {
147+ Interlocked . Increment ( ref Issue25671 . MeasurePasses ) ;
148+ Interlocked . Increment ( ref MeasurePasses ) ;
149+ return base . MeasureOverride ( widthConstraint , heightConstraint ) ;
150+ }
151+ }
152+
153+ public class Issue25671Button : Button
154+ {
155+ public static long MeasurePasses = 0 ;
156+ public static long ArrangePasses = 0 ;
157+
158+ protected override Size ArrangeOverride ( Rect bounds )
159+ {
160+ Interlocked . Increment ( ref Issue25671 . ArrangePasses ) ;
161+ Interlocked . Increment ( ref ArrangePasses ) ;
162+ return base . ArrangeOverride ( bounds ) ;
163+ }
164+
165+ protected override Size MeasureOverride ( double widthConstraint , double heightConstraint )
166+ {
167+ Interlocked . Increment ( ref Issue25671 . MeasurePasses ) ;
168+ Interlocked . Increment ( ref MeasurePasses ) ;
169+ return base . MeasureOverride ( widthConstraint , heightConstraint ) ;
170+ }
171+ }
172+
173+ public class Issue25671Image : Image
174+ {
175+ public static long MeasurePasses = 0 ;
176+ public static long ArrangePasses = 0 ;
177+
178+ protected override Size ArrangeOverride ( Rect bounds )
179+ {
180+ Interlocked . Increment ( ref Issue25671 . ArrangePasses ) ;
181+ Interlocked . Increment ( ref ArrangePasses ) ;
182+ return base . ArrangeOverride ( bounds ) ;
183+ }
184+
185+ protected override Size MeasureOverride ( double widthConstraint , double heightConstraint )
186+ {
187+ Interlocked . Increment ( ref Issue25671 . MeasurePasses ) ;
188+ Interlocked . Increment ( ref MeasurePasses ) ;
189+ return base . MeasureOverride ( widthConstraint , heightConstraint ) ;
190+ }
191+ }
0 commit comments