Skip to content

Commit 0cc7c09

Browse files
committed
implemented AlignSelf prop
1 parent 8fb4930 commit 0cc7c09

1 file changed

Lines changed: 42 additions & 48 deletions

File tree

src/Shared/HandyControl_Shared/Controls/Panel/FlexPanel.cs

Lines changed: 42 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Windows.Media;
66
using HandyControl.Data;
77
using HandyControl.Expression.Drawing;
8+
using HandyControl.Tools;
89

910
namespace 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

Comments
 (0)