55using System . Windows . Media ;
66using HandyControl . Data ;
77using HandyControl . Expression . Drawing ;
8+ using HandyControl . Tools ;
89
910namespace HandyControl . Controls
1011{
@@ -28,7 +29,7 @@ public static int GetOrder(DependencyObject element)
2829 => ( int ) element . GetValue ( OrderProperty ) ;
2930
3031 public static readonly DependencyProperty FlexGrowProperty = DependencyProperty . RegisterAttached (
31- "FlexGrow" , typeof ( double ) , typeof ( FlexPanel ) , new FrameworkPropertyMetadata ( ValueBoxes . Double0Box , OnItemPropertyChanged ) ) ;
32+ "FlexGrow" , typeof ( double ) , typeof ( FlexPanel ) , new FrameworkPropertyMetadata ( ValueBoxes . Double0Box , OnItemPropertyChanged ) , ValidateHelper . IsInRangeOfPosDoubleIncludeZero ) ;
3233
3334 public static void SetFlexGrow ( DependencyObject element , double value )
3435 => element . SetValue ( FlexGrowProperty , value ) ;
@@ -127,20 +128,28 @@ private static void OnItemPropertyChanged(DependencyObject d, DependencyProperty
127128
128129 protected override Size MeasureOverride ( Size constraint )
129130 {
130- _orderList . Clear ( ) ;
131131 var curLineSize = new UVSize ( FlexDirection ) ;
132132 var panelSize = new UVSize ( FlexDirection ) ;
133133 _uvConstraint = new UVSize ( FlexDirection , constraint ) ;
134134 var childConstraint = new Size ( constraint . Width , constraint . Height ) ;
135135 _lineCount = 1 ;
136136 var children = InternalChildren ;
137137
138+ _orderList . Clear ( ) ;
138139 for ( var i = 0 ; i < children . Count ; i ++ )
139140 {
140141 var child = children [ i ] ;
141142 if ( child == null ) continue ;
142143
143144 _orderList . Add ( new FlexItemInfo ( i , GetOrder ( child ) ) ) ;
145+ }
146+ _orderList . Sort ( ) ;
147+
148+ for ( var i = 0 ; i < children . Count ; i ++ )
149+ {
150+ var child = children [ _orderList [ i ] . Index ] ;
151+ if ( child == null ) continue ;
152+
144153 child . Measure ( childConstraint ) ;
145154
146155 var sz = new UVSize ( FlexDirection , child . DesiredSize ) ;
@@ -175,8 +184,6 @@ protected override Size MeasureOverride(Size constraint)
175184 }
176185 }
177186
178- _orderList . Sort ( ) ;
179-
180187 //the last line size, if any should be added
181188 panelSize . U = Math . Max ( curLineSize . U , panelSize . U ) ;
182189 panelSize . V += curLineSize . V ;
@@ -248,33 +255,27 @@ protected override Size ArrangeOverride(Size arrangeSize)
248255 var accumulatedFlag = FlexWrap == FlexWrap . WrapReverse ? 1 : 0 ;
249256 var itemsU = .0 ;
250257 var accumulatedV = .0 ;
251- var freeItemV = .0 ;
252258 var freeV = uvFinalSize . V ;
253259 foreach ( var flexSize in curLineSizeArr )
254260 {
255261 freeV -= flexSize . V ;
256262 }
263+ var freeItemV = freeV ;
257264
258265 // calculate status
259266 var lineFreeVArr = new double [ _lineCount ] ;
260267 switch ( AlignContent )
261268 {
262269 case FlexContentAlignment . Stretch :
270+ if ( _lineCount > 1 )
263271 {
264- if ( _lineCount > 1 )
272+ freeItemV = freeV / _lineCount ;
273+ for ( var i = 0 ; i < _lineCount ; i ++ )
265274 {
266- freeItemV = freeV / _lineCount ;
267- for ( var i = 0 ; i < _lineCount ; i ++ )
268- {
269- lineFreeVArr [ i ] = freeItemV ;
270- }
271-
272- accumulatedV = FlexWrap == FlexWrap . WrapReverse ? uvFinalSize . V - curLineSizeArr [ 0 ] . V - lineFreeVArr [ 0 ] : 0 ;
273- }
274- else
275- {
276- freeItemV = freeV ;
275+ lineFreeVArr [ i ] = freeItemV ;
277276 }
277+
278+ accumulatedV = FlexWrap == FlexWrap . WrapReverse ? uvFinalSize . V - curLineSizeArr [ 0 ] . V - lineFreeVArr [ 0 ] : 0 ;
278279 }
279280 break ;
280281 case FlexContentAlignment . FlexStart :
@@ -290,7 +291,6 @@ protected override Size ArrangeOverride(Size arrangeSize)
290291 else
291292 {
292293 wrapReverseAdd = 0 ;
293- freeItemV = freeV ;
294294 }
295295 break ;
296296 case FlexContentAlignment . FlexEnd :
@@ -306,53 +306,36 @@ protected override Size ArrangeOverride(Size arrangeSize)
306306 else
307307 {
308308 wrapReverseAdd = 0 ;
309- freeItemV = freeV ;
310309 }
311310 break ;
312311 case FlexContentAlignment . Center :
313312 if ( _lineCount > 1 )
314313 {
315314 accumulatedV = FlexWrap == FlexWrap . WrapReverse ? uvFinalSize . V - curLineSizeArr [ 0 ] . V - freeV * 0.5 : freeV * 0.5 ;
316315 }
317- else
318- {
319- freeItemV = freeV ;
320- }
321316 break ;
322317 case FlexContentAlignment . SpaceBetween :
318+ if ( _lineCount > 1 )
323319 {
324- if ( _lineCount > 1 )
325- {
326- freeItemV = freeV / ( _lineCount - 1 ) ;
327- for ( var i = 0 ; i < _lineCount - 1 ; i ++ )
328- {
329- lineFreeVArr [ i ] = freeItemV ;
330- }
331-
332- accumulatedV = FlexWrap == FlexWrap . WrapReverse ? uvFinalSize . V - curLineSizeArr [ 0 ] . V : 0 ;
333- }
334- else
320+ freeItemV = freeV / ( _lineCount - 1 ) ;
321+ for ( var i = 0 ; i < _lineCount - 1 ; i ++ )
335322 {
336- freeItemV = freeV ;
323+ lineFreeVArr [ i ] = freeItemV ;
337324 }
325+
326+ accumulatedV = FlexWrap == FlexWrap . WrapReverse ? uvFinalSize . V - curLineSizeArr [ 0 ] . V : 0 ;
338327 }
339328 break ;
340329 case FlexContentAlignment . SpaceAround :
330+ if ( _lineCount > 1 )
341331 {
342- if ( _lineCount > 1 )
332+ freeItemV = freeV / _lineCount * 0.5 ;
333+ for ( var i = 0 ; i < _lineCount - 1 ; i ++ )
343334 {
344- freeItemV = freeV / _lineCount * 0.5 ;
345- for ( var i = 0 ; i < _lineCount - 1 ; i ++ )
346- {
347- lineFreeVArr [ i ] = freeItemV * 2 ;
348- }
349-
350- accumulatedV = FlexWrap == FlexWrap . WrapReverse ? uvFinalSize . V - curLineSizeArr [ 0 ] . V - freeItemV : freeItemV ;
351- }
352- else
353- {
354- freeItemV = freeV ;
335+ lineFreeVArr [ i ] = freeItemV * 2 ;
355336 }
337+
338+ accumulatedV = FlexWrap == FlexWrap . WrapReverse ? uvFinalSize . V - curLineSizeArr [ 0 ] . V - freeItemV : freeItemV ;
356339 }
357340 break ;
358341 }
@@ -505,7 +488,18 @@ private void ArrangeLine(FlexLineInfo lineInfo)
505488 }
506489
507490 var v = lineInfo . OffsetV ;
508- switch ( AlignItems )
491+ var alignSelf = GetAlignSelf ( child ) ;
492+ FlexItemsAlignment alignment ;
493+ if ( alignSelf == FlexItemAlignment . Auto )
494+ {
495+ alignment = AlignItems ;
496+ }
497+ else
498+ {
499+ alignment = ( FlexItemsAlignment ) alignSelf ;
500+ }
501+
502+ switch ( alignment )
509503 {
510504 case FlexItemsAlignment . Stretch :
511505 if ( _lineCount == 1 && FlexWrap == FlexWrap . NoWrap )
0 commit comments