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+ public class Issue25671CollectionView : CollectionView
45+ {
46+ }
47+
48+ public class Issue25671AbsoluteLayout : AbsoluteLayout
49+ {
50+ public static long MeasurePasses = 0 ;
51+ public static long ArrangePasses = 0 ;
52+
53+ protected override Size ArrangeOverride ( Rect bounds )
54+ {
55+ Interlocked . Increment ( ref Issue25671 . ArrangePasses ) ;
56+ Interlocked . Increment ( ref ArrangePasses ) ;
57+ return base . ArrangeOverride ( bounds ) ;
58+ }
59+
60+ protected override Size MeasureOverride ( double widthConstraint , double heightConstraint )
61+ {
62+ Interlocked . Increment ( ref Issue25671 . MeasurePasses ) ;
63+ Interlocked . Increment ( ref MeasurePasses ) ;
64+ return base . MeasureOverride ( widthConstraint , heightConstraint ) ;
65+ }
66+ }
67+
68+ public class Issue25671VerticalStackLayout : VerticalStackLayout
69+ {
70+ public static long MeasurePasses = 0 ;
71+ public static long ArrangePasses = 0 ;
72+
73+ protected override Size ArrangeOverride ( Rect bounds )
74+ {
75+ Interlocked . Increment ( ref Issue25671 . ArrangePasses ) ;
76+ Interlocked . Increment ( ref ArrangePasses ) ;
77+ return base . ArrangeOverride ( bounds ) ;
78+ }
79+
80+ protected override Size MeasureOverride ( double widthConstraint , double heightConstraint )
81+ {
82+ Interlocked . Increment ( ref Issue25671 . MeasurePasses ) ;
83+ Interlocked . Increment ( ref MeasurePasses ) ;
84+ return base . MeasureOverride ( widthConstraint , heightConstraint ) ;
85+ }
86+ }
87+
88+ public class Issue25671Grid : Grid
89+ {
90+ public static long MeasurePasses = 0 ;
91+ public static long ArrangePasses = 0 ;
92+
93+ protected override Size ArrangeOverride ( Rect bounds )
94+ {
95+ Interlocked . Increment ( ref Issue25671 . ArrangePasses ) ;
96+ Interlocked . Increment ( ref ArrangePasses ) ;
97+ return base . ArrangeOverride ( bounds ) ;
98+ }
99+
100+ protected override Size MeasureOverride ( double widthConstraint , double heightConstraint )
101+ {
102+ Interlocked . Increment ( ref Issue25671 . MeasurePasses ) ;
103+ Interlocked . Increment ( ref MeasurePasses ) ;
104+ return base . MeasureOverride ( widthConstraint , heightConstraint ) ;
105+ }
106+ }
107+
108+ public class Issue25671ContentView : ContentView
109+ {
110+ public static long MeasurePasses = 0 ;
111+ public static long ArrangePasses = 0 ;
112+
113+ protected override Size ArrangeOverride ( Rect bounds )
114+ {
115+ Interlocked . Increment ( ref Issue25671 . ArrangePasses ) ;
116+ Interlocked . Increment ( ref ArrangePasses ) ;
117+ return base . ArrangeOverride ( bounds ) ;
118+ }
119+
120+ protected override Size MeasureOverride ( double widthConstraint , double heightConstraint )
121+ {
122+ Interlocked . Increment ( ref Issue25671 . MeasurePasses ) ;
123+ Interlocked . Increment ( ref MeasurePasses ) ;
124+ return base . MeasureOverride ( widthConstraint , heightConstraint ) ;
125+ }
126+ }
127+
128+ public class Issue25671Label : Label
129+ {
130+ public static long MeasurePasses = 0 ;
131+ public static long ArrangePasses = 0 ;
132+
133+ protected override Size ArrangeOverride ( Rect bounds )
134+ {
135+ Interlocked . Increment ( ref Issue25671 . ArrangePasses ) ;
136+ Interlocked . Increment ( ref ArrangePasses ) ;
137+ return base . ArrangeOverride ( bounds ) ;
138+ }
139+
140+ protected override Size MeasureOverride ( double widthConstraint , double heightConstraint )
141+ {
142+ Interlocked . Increment ( ref Issue25671 . MeasurePasses ) ;
143+ Interlocked . Increment ( ref MeasurePasses ) ;
144+ return base . MeasureOverride ( widthConstraint , heightConstraint ) ;
145+ }
146+ }
147+
148+ public class Issue25671Button : Button
149+ {
150+ public static long MeasurePasses = 0 ;
151+ public static long ArrangePasses = 0 ;
152+
153+ protected override Size ArrangeOverride ( Rect bounds )
154+ {
155+ Interlocked . Increment ( ref Issue25671 . ArrangePasses ) ;
156+ Interlocked . Increment ( ref ArrangePasses ) ;
157+ return base . ArrangeOverride ( bounds ) ;
158+ }
159+
160+ protected override Size MeasureOverride ( double widthConstraint , double heightConstraint )
161+ {
162+ Interlocked . Increment ( ref Issue25671 . MeasurePasses ) ;
163+ Interlocked . Increment ( ref MeasurePasses ) ;
164+ return base . MeasureOverride ( widthConstraint , heightConstraint ) ;
165+ }
166+ }
167+
168+ public class Issue25671Image : Image
169+ {
170+ public static long MeasurePasses = 0 ;
171+ public static long ArrangePasses = 0 ;
172+
173+ protected override Size ArrangeOverride ( Rect bounds )
174+ {
175+ Interlocked . Increment ( ref Issue25671 . ArrangePasses ) ;
176+ Interlocked . Increment ( ref ArrangePasses ) ;
177+ return base . ArrangeOverride ( bounds ) ;
178+ }
179+
180+ protected override Size MeasureOverride ( double widthConstraint , double heightConstraint )
181+ {
182+ Interlocked . Increment ( ref Issue25671 . MeasurePasses ) ;
183+ Interlocked . Increment ( ref MeasurePasses ) ;
184+ return base . MeasureOverride ( widthConstraint , heightConstraint ) ;
185+ }
186+ }
0 commit comments