performance optimization
This commit is contained in:
1 parent
4b7124d5c8
commit
65c2e10dc7
8 files changed
+124
-84
No files matched your search
@@ -25,6 +25,8 @@ namespace HandyControl.Controls
|
||||
|
||||
private bool _isDisposed;
|
||||
|
||||
private int _columns = 1;
|
||||
|
||||
public ImageBlock()
|
||||
{
|
||||
_dispatcherTimer = new DispatcherTimer(DispatcherPriority.Render)
|
||||
@@ -68,16 +70,23 @@ namespace HandyControl.Controls
|
||||
private void UpdateDatas()
|
||||
{
|
||||
if (_source == null) return;
|
||||
_indexMin = StartRow * Columns + StartColumn;
|
||||
_indexMax = EndRow * Columns + EndColumn;
|
||||
|
||||
_indexMin = StartRow * _columns + StartColumn;
|
||||
_indexMax = EndRow * _columns + EndColumn;
|
||||
_currentIndex = _indexMin;
|
||||
_blockWidth = _source.PixelWidth / Columns;
|
||||
_blockWidth = _source.PixelWidth / _columns;
|
||||
_blockHeight = _source.PixelHeight / Rows;
|
||||
}
|
||||
|
||||
private static void OnPositionsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
var ctl = (ImageBlock)d;
|
||||
|
||||
if (e.Property == ColumnsProperty)
|
||||
{
|
||||
ctl._columns = (int)e.NewValue;
|
||||
}
|
||||
|
||||
ctl.UpdateDatas();
|
||||
}
|
||||
|
||||
@@ -212,8 +221,8 @@ namespace HandyControl.Controls
|
||||
_currentIndex = _indexMin;
|
||||
}
|
||||
|
||||
var x = _currentIndex % Columns * _blockWidth;
|
||||
var y = _currentIndex / Columns * _blockHeight;
|
||||
var x = _currentIndex % _columns * _blockWidth;
|
||||
var y = _currentIndex / _columns * _blockHeight;
|
||||
|
||||
var rect = new Int32Rect(x, y, _blockWidth, _blockHeight);
|
||||
_currentIndex++;
|
||||
|
||||
@@ -122,7 +122,7 @@ namespace HandyControl.Controls
|
||||
UpdateDots();
|
||||
}
|
||||
|
||||
protected Ellipse CreateEllipse(int index)
|
||||
protected virtual Ellipse CreateEllipse(int index)
|
||||
{
|
||||
var ellipse = new Ellipse();
|
||||
ellipse.SetBinding(WidthProperty, new Binding(DotDiameterProperty.Name) {Source = this});
|
||||
|
||||
@@ -41,7 +41,13 @@ namespace HandyControl.Controls
|
||||
|
||||
protected sealed override void UpdateDots()
|
||||
{
|
||||
if (DotCount < 1) return;
|
||||
var dotCount = DotCount;
|
||||
var dotInterval = DotInterval;
|
||||
var dotSpeed = DotSpeed;
|
||||
var dotDelayTime = DotDelayTime;
|
||||
var needHidden = NeedHidden;
|
||||
|
||||
if (dotCount < 1) return;
|
||||
PrivateCanvas.Children.Clear();
|
||||
|
||||
//定义动画
|
||||
@@ -51,16 +57,16 @@ namespace HandyControl.Controls
|
||||
};
|
||||
|
||||
//创建圆点
|
||||
for (var i = 0; i < DotCount; i++)
|
||||
for (var i = 0; i < dotCount; i++)
|
||||
{
|
||||
var border = CreateBorder(i);
|
||||
var border = CreateBorder(i, dotInterval, needHidden);
|
||||
|
||||
var framesMove = new DoubleAnimationUsingKeyFrames
|
||||
{
|
||||
BeginTime = TimeSpan.FromMilliseconds(DotDelayTime * i)
|
||||
BeginTime = TimeSpan.FromMilliseconds(dotDelayTime * i)
|
||||
};
|
||||
|
||||
var subAngle = -DotInterval * i;
|
||||
var subAngle = -dotInterval * i;
|
||||
|
||||
//开始位置
|
||||
var frame0 = new LinearDoubleKeyFrame
|
||||
@@ -77,14 +83,14 @@ namespace HandyControl.Controls
|
||||
EasingMode = EasingMode.EaseOut
|
||||
},
|
||||
Value = 180 + subAngle,
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(DotSpeed * (0.75 / 7)))
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(dotSpeed * (0.75 / 7)))
|
||||
};
|
||||
|
||||
//第一次匀速开始到第一次匀速结束
|
||||
var frame2 = new LinearDoubleKeyFrame
|
||||
{
|
||||
Value = 180 + DotOffSet + subAngle,
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(DotSpeed * (2.75 / 7)))
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(dotSpeed * (2.75 / 7)))
|
||||
};
|
||||
|
||||
//第一次匀速结束到匀加速结束
|
||||
@@ -95,7 +101,7 @@ namespace HandyControl.Controls
|
||||
EasingMode = EasingMode.EaseIn
|
||||
},
|
||||
Value = 360 + subAngle,
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(DotSpeed * (3.5 / 7)))
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(dotSpeed * (3.5 / 7)))
|
||||
};
|
||||
|
||||
//匀加速结束到匀减速结束
|
||||
@@ -106,14 +112,14 @@ namespace HandyControl.Controls
|
||||
EasingMode = EasingMode.EaseOut
|
||||
},
|
||||
Value = 540 + subAngle,
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(DotSpeed * (4.25 / 7)))
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(dotSpeed * (4.25 / 7)))
|
||||
};
|
||||
|
||||
//匀减速结束到第二次匀速结束
|
||||
var frame5 = new LinearDoubleKeyFrame
|
||||
{
|
||||
Value = 540 + DotOffSet + subAngle,
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(DotSpeed * (6.25 / 7)))
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(dotSpeed * (6.25 / 7)))
|
||||
};
|
||||
|
||||
//第二次匀速结束到匀加速结束
|
||||
@@ -124,7 +130,7 @@ namespace HandyControl.Controls
|
||||
EasingMode = EasingMode.EaseIn
|
||||
},
|
||||
Value = 720 + subAngle,
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(DotSpeed))
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(dotSpeed))
|
||||
};
|
||||
|
||||
framesMove.KeyFrames.Add(frame0);
|
||||
@@ -145,13 +151,13 @@ namespace HandyControl.Controls
|
||||
var frame7 = new DiscreteObjectKeyFrame
|
||||
{
|
||||
Value = Visibility.Collapsed,
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(DotSpeed))
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(dotSpeed))
|
||||
};
|
||||
|
||||
var frame8 = new DiscreteObjectKeyFrame
|
||||
{
|
||||
Value = Visibility.Collapsed,
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(DotSpeed + 0.4))
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(dotSpeed + 0.4))
|
||||
};
|
||||
|
||||
var frame9 = new DiscreteObjectKeyFrame
|
||||
@@ -161,7 +167,7 @@ namespace HandyControl.Controls
|
||||
};
|
||||
var framesVisibility = new ObjectAnimationUsingKeyFrames
|
||||
{
|
||||
BeginTime = TimeSpan.FromMilliseconds(DotDelayTime * i)
|
||||
BeginTime = TimeSpan.FromMilliseconds(dotDelayTime * i)
|
||||
};
|
||||
framesVisibility.KeyFrames.Add(frame9);
|
||||
framesVisibility.KeyFrames.Add(frame7);
|
||||
@@ -176,14 +182,14 @@ namespace HandyControl.Controls
|
||||
Storyboard.Begin();
|
||||
}
|
||||
|
||||
private Border CreateBorder(int index)
|
||||
private Border CreateBorder(int index, double dotInterval, bool needHidden)
|
||||
{
|
||||
var ellipse = CreateEllipse(index);
|
||||
ellipse.HorizontalAlignment = HorizontalAlignment.Center;
|
||||
ellipse.VerticalAlignment = VerticalAlignment.Bottom;
|
||||
var rt = new RotateTransform
|
||||
{
|
||||
Angle = -DotInterval * index
|
||||
Angle = -dotInterval * index
|
||||
};
|
||||
var myTransGroup = new TransformGroup();
|
||||
myTransGroup.Children.Add(rt);
|
||||
@@ -192,7 +198,7 @@ namespace HandyControl.Controls
|
||||
RenderTransformOrigin = new Point(0.5, 0.5),
|
||||
RenderTransform = myTransGroup,
|
||||
Child = ellipse,
|
||||
Visibility = NeedHidden ? Visibility.Collapsed : Visibility.Visible
|
||||
Visibility = needHidden ? Visibility.Collapsed : Visibility.Visible
|
||||
};
|
||||
border.SetBinding(WidthProperty, new Binding("Width") { Source = this });
|
||||
border.SetBinding(HeightProperty, new Binding("Height") { Source = this });
|
||||
|
||||
@@ -20,11 +20,17 @@ namespace HandyControl.Controls
|
||||
|
||||
protected sealed override void UpdateDots()
|
||||
{
|
||||
if (DotCount < 1) return;
|
||||
var dotCount = DotCount;
|
||||
var dotInterval = DotInterval;
|
||||
var dotDiameter = DotDiameter;
|
||||
var dotSpeed = DotSpeed;
|
||||
var dotDelayTime = DotDelayTime;
|
||||
|
||||
if (dotCount < 1) return;
|
||||
PrivateCanvas.Children.Clear();
|
||||
|
||||
//计算相关尺寸
|
||||
var centerWidth = DotDiameter * DotCount + DotInterval * (DotCount - 1) + MoveLength;
|
||||
var centerWidth = dotDiameter * dotCount + dotInterval * (dotCount - 1) + MoveLength;
|
||||
var speedDownLength = (ActualWidth - MoveLength) / 2;
|
||||
var speedUniformLength = centerWidth / 2;
|
||||
|
||||
@@ -35,13 +41,13 @@ namespace HandyControl.Controls
|
||||
};
|
||||
|
||||
//创建圆点
|
||||
for (var i = 0; i < DotCount; i++)
|
||||
for (var i = 0; i < dotCount; i++)
|
||||
{
|
||||
var ellipse = CreateEllipse(i);
|
||||
var ellipse = CreateEllipse(i, dotInterval, dotDiameter);
|
||||
|
||||
var frames = new ThicknessAnimationUsingKeyFrames
|
||||
{
|
||||
BeginTime = TimeSpan.FromMilliseconds(DotDelayTime * i)
|
||||
BeginTime = TimeSpan.FromMilliseconds(dotDelayTime * i)
|
||||
};
|
||||
//开始位置
|
||||
var frame0 = new LinearThicknessKeyFrame
|
||||
@@ -58,14 +64,14 @@ namespace HandyControl.Controls
|
||||
EasingMode = EasingMode.EaseOut
|
||||
},
|
||||
Value = new Thickness(speedDownLength + ellipse.Margin.Left, 0, 0, 0),
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(DotSpeed * (1 - UniformScale)/2))
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(dotSpeed * (1 - UniformScale)/2))
|
||||
};
|
||||
|
||||
//匀速开始到匀速结束
|
||||
var frame2 = new LinearThicknessKeyFrame
|
||||
{
|
||||
Value = new Thickness(speedDownLength + speedUniformLength + ellipse.Margin.Left, 0, 0, 0),
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(DotSpeed * (1 + UniformScale) / 2))
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(dotSpeed * (1 + UniformScale) / 2))
|
||||
};
|
||||
|
||||
//匀速结束到匀加速结束
|
||||
@@ -76,7 +82,7 @@ namespace HandyControl.Controls
|
||||
EasingMode = EasingMode.EaseIn
|
||||
},
|
||||
Value = new Thickness(ActualWidth + ellipse.Margin.Left + speedUniformLength, 0, 0, 0),
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(DotSpeed))
|
||||
KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(dotSpeed))
|
||||
};
|
||||
|
||||
frames.KeyFrames.Add(frame0);
|
||||
@@ -94,12 +100,12 @@ namespace HandyControl.Controls
|
||||
Storyboard.Begin();
|
||||
}
|
||||
|
||||
private new Ellipse CreateEllipse(int index)
|
||||
private Ellipse CreateEllipse(int index, double dotInterval, double dotDiameter)
|
||||
{
|
||||
var ellipse = base.CreateEllipse(index);
|
||||
ellipse.HorizontalAlignment = HorizontalAlignment.Left;
|
||||
ellipse.VerticalAlignment = VerticalAlignment.Top;
|
||||
ellipse.Margin = new Thickness(-(DotInterval + DotDiameter) * index, 0, 0, 0);
|
||||
ellipse.Margin = new Thickness(-(dotInterval + dotDiameter) * index, 0, 0, 0);
|
||||
return ellipse;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,9 +37,11 @@ namespace HandyControl.Controls
|
||||
|
||||
protected override Size MeasureOverride(Size availableSize)
|
||||
{
|
||||
if (Children.Count == 0) return new Size(Diameter, Diameter);
|
||||
var diameter = Diameter;
|
||||
|
||||
var newSize = new Size(Diameter, Diameter);
|
||||
if (Children.Count == 0) return new Size(diameter, diameter);
|
||||
|
||||
var newSize = new Size(diameter, diameter);
|
||||
|
||||
foreach (UIElement element in Children)
|
||||
{
|
||||
@@ -51,6 +53,9 @@ namespace HandyControl.Controls
|
||||
|
||||
protected override Size ArrangeOverride(Size finalSize)
|
||||
{
|
||||
var keepVertical = KeepVertical;
|
||||
var offsetAngle = OffsetAngle;
|
||||
|
||||
var i = 0;
|
||||
var perDeg = 360.0 / Children.Count;
|
||||
var radius = Diameter / 2;
|
||||
@@ -59,19 +64,23 @@ namespace HandyControl.Controls
|
||||
{
|
||||
var centerX = element.DesiredSize.Width / 2.0;
|
||||
var centerY = element.DesiredSize.Height / 2.0;
|
||||
var angle = perDeg * i++ + OffsetAngle;
|
||||
var angle = perDeg * i++ + offsetAngle;
|
||||
|
||||
var transform = new RotateTransform
|
||||
{
|
||||
CenterX = centerX,
|
||||
CenterY = centerY,
|
||||
Angle = KeepVertical ? 0 : angle
|
||||
Angle = keepVertical ? 0 : angle
|
||||
};
|
||||
element.RenderTransform = transform;
|
||||
|
||||
var r = Math.PI * angle / 180.0;
|
||||
var x = radius * Math.Cos(r);
|
||||
var y = radius * Math.Sin(r);
|
||||
|
||||
var rectX = x + finalSize.Width / 2 - centerX;
|
||||
var rectY = y + finalSize.Height / 2 - centerY;
|
||||
|
||||
element.Arrange(new Rect(rectX, rectY, element.DesiredSize.Width, element.DesiredSize.Height));
|
||||
}
|
||||
|
||||
|
||||
@@ -144,9 +144,12 @@ namespace HandyControl.Controls
|
||||
|
||||
protected override Size MeasureOverride(Size constraint)
|
||||
{
|
||||
var curLineSize = new UVSize(FlexDirection);
|
||||
var panelSize = new UVSize(FlexDirection);
|
||||
_uvConstraint = new UVSize(FlexDirection, constraint);
|
||||
var flexDirection = FlexDirection;
|
||||
var flexWrap = FlexWrap;
|
||||
|
||||
var curLineSize = new UVSize(flexDirection);
|
||||
var panelSize = new UVSize(flexDirection);
|
||||
_uvConstraint = new UVSize(flexDirection, constraint);
|
||||
var childConstraint = new Size(constraint.Width, constraint.Height);
|
||||
_lineCount = 1;
|
||||
var children = InternalChildren;
|
||||
@@ -174,9 +177,9 @@ namespace HandyControl.Controls
|
||||
}
|
||||
child.Measure(childConstraint);
|
||||
|
||||
var sz = new UVSize(FlexDirection, child.DesiredSize);
|
||||
var sz = new UVSize(flexDirection, child.DesiredSize);
|
||||
|
||||
if (FlexWrap == FlexWrap.NoWrap) //continue to accumulate a line
|
||||
if (flexWrap == FlexWrap.NoWrap) //continue to accumulate a line
|
||||
{
|
||||
curLineSize.U += sz.U;
|
||||
curLineSize.V = Math.Max(sz.V, curLineSize.V);
|
||||
@@ -194,7 +197,7 @@ namespace HandyControl.Controls
|
||||
{
|
||||
panelSize.U = Math.Max(sz.U, panelSize.U);
|
||||
panelSize.V += sz.V;
|
||||
curLineSize = new UVSize(FlexDirection);
|
||||
curLineSize = new UVSize(flexDirection);
|
||||
_lineCount++;
|
||||
}
|
||||
}
|
||||
@@ -216,7 +219,11 @@ namespace HandyControl.Controls
|
||||
|
||||
protected override Size ArrangeOverride(Size arrangeSize)
|
||||
{
|
||||
var uvFinalSize = new UVSize(FlexDirection, arrangeSize);
|
||||
var flexDirection = FlexDirection;
|
||||
var flexWrap = FlexWrap;
|
||||
var alignContent = AlignContent;
|
||||
|
||||
var uvFinalSize = new UVSize(flexDirection, arrangeSize);
|
||||
if (MathHelper.IsZero(uvFinalSize.U) || MathHelper.IsZero(uvFinalSize.V)) return arrangeSize;
|
||||
|
||||
// init status
|
||||
@@ -224,7 +231,7 @@ namespace HandyControl.Controls
|
||||
var lineIndex = 0;
|
||||
|
||||
var curLineSizeArr = new UVSize[_lineCount];
|
||||
curLineSizeArr[0] = new UVSize(FlexDirection);
|
||||
curLineSizeArr[0] = new UVSize(flexDirection);
|
||||
|
||||
var lastInLineArr = new int[_lineCount];
|
||||
for (var i = 0; i < _lineCount; i++)
|
||||
@@ -238,9 +245,9 @@ namespace HandyControl.Controls
|
||||
var child = children[_orderList[i].Index];
|
||||
if (child == null) continue;
|
||||
|
||||
var sz = new UVSize(FlexDirection, child.DesiredSize);
|
||||
var sz = new UVSize(flexDirection, child.DesiredSize);
|
||||
|
||||
if (FlexWrap == FlexWrap.NoWrap)
|
||||
if (flexWrap == FlexWrap.NoWrap)
|
||||
{
|
||||
curLineSizeArr[lineIndex].U += sz.U;
|
||||
curLineSizeArr[lineIndex].V = Math.Max(sz.V, curLineSizeArr[lineIndex].V);
|
||||
@@ -258,7 +265,7 @@ namespace HandyControl.Controls
|
||||
//switch to next line which only contain one element
|
||||
lastInLineArr[lineIndex] = i;
|
||||
lineIndex++;
|
||||
curLineSizeArr[lineIndex] = new UVSize(FlexDirection);
|
||||
curLineSizeArr[lineIndex] = new UVSize(flexDirection);
|
||||
}
|
||||
}
|
||||
else //continue to accumulate a line
|
||||
@@ -273,8 +280,8 @@ namespace HandyControl.Controls
|
||||
var scaleU = Math.Min(_uvConstraint.U / uvFinalSize.U, 1);
|
||||
var firstInLine = 0;
|
||||
var wrapReverseAdd = 0;
|
||||
var wrapReverseFlag = FlexWrap == FlexWrap.WrapReverse ? -1 : 1;
|
||||
var accumulatedFlag = FlexWrap == FlexWrap.WrapReverse ? 1 : 0;
|
||||
var wrapReverseFlag = flexWrap == FlexWrap.WrapReverse ? -1 : 1;
|
||||
var accumulatedFlag = flexWrap == FlexWrap.WrapReverse ? 1 : 0;
|
||||
var itemsU = .0;
|
||||
var accumulatedV = .0;
|
||||
var freeV = uvFinalSize.V;
|
||||
@@ -287,7 +294,7 @@ namespace HandyControl.Controls
|
||||
|
||||
// calculate status
|
||||
var lineFreeVArr = new double[_lineCount];
|
||||
switch (AlignContent)
|
||||
switch (alignContent)
|
||||
{
|
||||
case FlexContentAlignment.Stretch:
|
||||
if (_lineCount > 1)
|
||||
@@ -298,15 +305,15 @@ namespace HandyControl.Controls
|
||||
lineFreeVArr[i] = freeItemV;
|
||||
}
|
||||
|
||||
accumulatedV = FlexWrap == FlexWrap.WrapReverse ? uvFinalSize.V - curLineSizeArr[0].V - lineFreeVArr[0] : 0;
|
||||
accumulatedV = flexWrap == FlexWrap.WrapReverse ? uvFinalSize.V - curLineSizeArr[0].V - lineFreeVArr[0] : 0;
|
||||
}
|
||||
|
||||
break;
|
||||
case FlexContentAlignment.FlexStart:
|
||||
wrapReverseAdd = FlexWrap == FlexWrap.WrapReverse ? 0 : 1;
|
||||
wrapReverseAdd = flexWrap == FlexWrap.WrapReverse ? 0 : 1;
|
||||
if (_lineCount > 1)
|
||||
{
|
||||
accumulatedV = FlexWrap == FlexWrap.WrapReverse ? uvFinalSize.V - curLineSizeArr[0].V : 0;
|
||||
accumulatedV = flexWrap == FlexWrap.WrapReverse ? uvFinalSize.V - curLineSizeArr[0].V : 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -315,10 +322,10 @@ namespace HandyControl.Controls
|
||||
|
||||
break;
|
||||
case FlexContentAlignment.FlexEnd:
|
||||
wrapReverseAdd = FlexWrap == FlexWrap.WrapReverse ? 1 : 0;
|
||||
wrapReverseAdd = flexWrap == FlexWrap.WrapReverse ? 1 : 0;
|
||||
if (_lineCount > 1)
|
||||
{
|
||||
accumulatedV = FlexWrap == FlexWrap.WrapReverse ? uvFinalSize.V - curLineSizeArr[0].V - freeV : freeV;
|
||||
accumulatedV = flexWrap == FlexWrap.WrapReverse ? uvFinalSize.V - curLineSizeArr[0].V - freeV : freeV;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -329,7 +336,7 @@ namespace HandyControl.Controls
|
||||
case FlexContentAlignment.Center:
|
||||
if (_lineCount > 1)
|
||||
{
|
||||
accumulatedV = FlexWrap == FlexWrap.WrapReverse ? uvFinalSize.V - curLineSizeArr[0].V - freeV * 0.5 : freeV * 0.5;
|
||||
accumulatedV = flexWrap == FlexWrap.WrapReverse ? uvFinalSize.V - curLineSizeArr[0].V - freeV * 0.5 : freeV * 0.5;
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -342,7 +349,7 @@ namespace HandyControl.Controls
|
||||
lineFreeVArr[i] = freeItemV;
|
||||
}
|
||||
|
||||
accumulatedV = FlexWrap == FlexWrap.WrapReverse ? uvFinalSize.V - curLineSizeArr[0].V : 0;
|
||||
accumulatedV = flexWrap == FlexWrap.WrapReverse ? uvFinalSize.V - curLineSizeArr[0].V : 0;
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -355,7 +362,7 @@ namespace HandyControl.Controls
|
||||
lineFreeVArr[i] = freeItemV * 2;
|
||||
}
|
||||
|
||||
accumulatedV = FlexWrap == FlexWrap.WrapReverse ? uvFinalSize.V - curLineSizeArr[0].V - freeItemV : freeItemV;
|
||||
accumulatedV = flexWrap == FlexWrap.WrapReverse ? uvFinalSize.V - curLineSizeArr[0].V - freeItemV : freeItemV;
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -370,9 +377,9 @@ namespace HandyControl.Controls
|
||||
var child = children[_orderList[i].Index];
|
||||
if (child == null) continue;
|
||||
|
||||
var sz = new UVSize(FlexDirection, child.DesiredSize);
|
||||
var sz = new UVSize(flexDirection, child.DesiredSize);
|
||||
|
||||
if (FlexWrap != FlexWrap.NoWrap)
|
||||
if (flexWrap != FlexWrap.NoWrap)
|
||||
{
|
||||
if (i >= lastInLineArr[lineIndex]) //need to switch to another line
|
||||
{
|
||||
@@ -392,8 +399,7 @@ namespace HandyControl.Controls
|
||||
lineIndex++;
|
||||
itemsU = 0;
|
||||
|
||||
if (i >= lastInLineArr[lineIndex]
|
||||
) //the element is wider then the constraint - give it a separate line
|
||||
if (i >= lastInLineArr[lineIndex]) //the element is wider then the constraint - give it a separate line
|
||||
{
|
||||
//switch to next line which only contain one element
|
||||
ArrangeLine(new FlexLineInfo
|
||||
@@ -441,8 +447,13 @@ namespace HandyControl.Controls
|
||||
|
||||
private void ArrangeLine(FlexLineInfo lineInfo)
|
||||
{
|
||||
var isHorizontal = FlexDirection == FlexDirection.Row || FlexDirection == FlexDirection.RowReverse;
|
||||
var isReverse = FlexDirection == FlexDirection.RowReverse || FlexDirection == FlexDirection.ColumnReverse;
|
||||
var flexDirection = FlexDirection;
|
||||
var flexWrap = FlexWrap;
|
||||
var justifyContent = JustifyContent;
|
||||
var alignItems = AlignItems;
|
||||
|
||||
var isHorizontal = flexDirection == FlexDirection.Row || flexDirection == FlexDirection.RowReverse;
|
||||
var isReverse = flexDirection == FlexDirection.RowReverse || flexDirection == FlexDirection.ColumnReverse;
|
||||
var itemCount = lineInfo.ItemEndIndex - lineInfo.ItemStartIndex;
|
||||
var children = InternalChildren;
|
||||
var lineFreeU = lineInfo.LineU - lineInfo.ItemsU;
|
||||
@@ -452,7 +463,7 @@ namespace HandyControl.Controls
|
||||
var u = .0;
|
||||
if (isReverse)
|
||||
{
|
||||
u = JustifyContent switch
|
||||
u = justifyContent switch
|
||||
{
|
||||
FlexContentJustify.FlexStart => lineInfo.LineU,
|
||||
FlexContentJustify.SpaceBetween => lineInfo.LineU,
|
||||
@@ -464,7 +475,7 @@ namespace HandyControl.Controls
|
||||
}
|
||||
else
|
||||
{
|
||||
u = JustifyContent switch
|
||||
u = justifyContent switch
|
||||
{
|
||||
FlexContentJustify.FlexEnd => lineFreeU,
|
||||
FlexContentJustify.Center => lineFreeU * 0.5,
|
||||
@@ -550,7 +561,7 @@ namespace HandyControl.Controls
|
||||
var offsetUArr = new double[itemCount];
|
||||
if (lineFreeU > 0)
|
||||
{
|
||||
if (JustifyContent == FlexContentJustify.SpaceBetween)
|
||||
if (justifyContent == FlexContentJustify.SpaceBetween)
|
||||
{
|
||||
var freeItemU = lineFreeU / (itemCount - 1);
|
||||
for (var i = 1; i < itemCount; i++)
|
||||
@@ -558,7 +569,7 @@ namespace HandyControl.Controls
|
||||
offsetUArr[i] = freeItemU;
|
||||
}
|
||||
}
|
||||
else if (JustifyContent == FlexContentJustify.SpaceAround)
|
||||
else if (justifyContent == FlexContentJustify.SpaceAround)
|
||||
{
|
||||
var freeItemU = lineFreeU / itemCount * 0.5;
|
||||
offsetUArr[0] = freeItemU;
|
||||
@@ -575,7 +586,7 @@ namespace HandyControl.Controls
|
||||
var child = children[_orderList[i].Index];
|
||||
if (child == null) continue;
|
||||
|
||||
var childSize = new UVSize(FlexDirection, isHorizontal
|
||||
var childSize = new UVSize(flexDirection, isHorizontal
|
||||
? new Size(child.DesiredSize.Width * lineInfo.ScaleU, child.DesiredSize.Height)
|
||||
: new Size(child.DesiredSize.Width, child.DesiredSize.Height * lineInfo.ScaleU));
|
||||
|
||||
@@ -593,12 +604,12 @@ namespace HandyControl.Controls
|
||||
|
||||
var v = lineInfo.OffsetV;
|
||||
var alignSelf = GetAlignSelf(child);
|
||||
var alignment = alignSelf == FlexItemAlignment.Auto ? AlignItems : (FlexItemsAlignment)alignSelf;
|
||||
var alignment = alignSelf == FlexItemAlignment.Auto ? alignItems : (FlexItemsAlignment)alignSelf;
|
||||
|
||||
switch (alignment)
|
||||
{
|
||||
case FlexItemsAlignment.Stretch:
|
||||
if (_lineCount == 1 && FlexWrap == FlexWrap.NoWrap)
|
||||
if (_lineCount == 1 && flexWrap == FlexWrap.NoWrap)
|
||||
{
|
||||
childSize.V = lineInfo.LineV + lineInfo.LineFreeV;
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ namespace HandyControl.Controls
|
||||
private static bool OnSpanValidate(object value)
|
||||
{
|
||||
var v = (int)value;
|
||||
return v >= 1 || v <= 24;
|
||||
return v >= 1 && v <= 24;
|
||||
}
|
||||
|
||||
public int Span
|
||||
|
||||
@@ -8,7 +8,8 @@ namespace HandyControl.Controls
|
||||
public class WaterfallPanel : Panel
|
||||
{
|
||||
public static readonly DependencyProperty GroupsProperty = DependencyProperty.Register(
|
||||
"Groups", typeof(int), typeof(WaterfallPanel), new FrameworkPropertyMetadata(ValueBoxes.Int2Box, FrameworkPropertyMetadataOptions.AffectsMeasure), IsGroupsValid);
|
||||
"Groups", typeof(int), typeof(WaterfallPanel), new FrameworkPropertyMetadata(
|
||||
ValueBoxes.Int2Box, FrameworkPropertyMetadataOptions.AffectsMeasure), IsGroupsValid);
|
||||
|
||||
public int Groups
|
||||
{
|
||||
@@ -16,11 +17,7 @@ namespace HandyControl.Controls
|
||||
set => SetValue(GroupsProperty, value);
|
||||
}
|
||||
|
||||
private static bool IsGroupsValid(object value)
|
||||
{
|
||||
var v = (int)value;
|
||||
return v >= 1;
|
||||
}
|
||||
private static bool IsGroupsValid(object value) => (int)value >= 1;
|
||||
|
||||
public static readonly DependencyProperty OrientationProperty = DependencyProperty.Register(
|
||||
"Orientation", typeof(Orientation), typeof(WaterfallPanel), new FrameworkPropertyMetadata(
|
||||
@@ -34,14 +31,16 @@ namespace HandyControl.Controls
|
||||
|
||||
protected override Size MeasureOverride(Size constraint)
|
||||
{
|
||||
if (Groups < 1) return constraint;
|
||||
var groups = Groups;
|
||||
|
||||
if (groups < 1) return constraint;
|
||||
var children = InternalChildren;
|
||||
Size panelSize;
|
||||
|
||||
if (Orientation == Orientation.Horizontal)
|
||||
{
|
||||
var heightArr = new double[Groups].ToList();
|
||||
var itemWidth = constraint.Width / Groups;
|
||||
var heightArr = new double[groups].ToList();
|
||||
var itemWidth = constraint.Width / groups;
|
||||
if (double.IsNaN(itemWidth) || double.IsInfinity(itemWidth)) return constraint;
|
||||
|
||||
for (int i = 0, count = children.Count; i < count; i++)
|
||||
@@ -60,8 +59,8 @@ namespace HandyControl.Controls
|
||||
}
|
||||
else
|
||||
{
|
||||
var widthArr = new double[Groups].ToList();
|
||||
var itemHeight = constraint.Height / Groups;
|
||||
var widthArr = new double[groups].ToList();
|
||||
var itemHeight = constraint.Height / groups;
|
||||
if (double.IsNaN(itemHeight) || double.IsInfinity(itemHeight)) return constraint;
|
||||
|
||||
for (int i = 0, count = children.Count; i < count; i++)
|
||||
|
||||
Reference in new issue
Block a user