|
|
|
@ -248,52 +248,21 @@ namespace Avalonia.Controls.Shapes |
|
|
|
|
|
|
|
protected override Size MeasureOverride(Size availableSize) |
|
|
|
{ |
|
|
|
bool deferCalculateTransform; |
|
|
|
switch (Stretch) |
|
|
|
if (DefiningGeometry is null) |
|
|
|
{ |
|
|
|
case Stretch.Fill: |
|
|
|
case Stretch.UniformToFill: |
|
|
|
deferCalculateTransform = double.IsInfinity(availableSize.Width) || double.IsInfinity(availableSize.Height); |
|
|
|
break; |
|
|
|
case Stretch.Uniform: |
|
|
|
deferCalculateTransform = double.IsInfinity(availableSize.Width) && double.IsInfinity(availableSize.Height); |
|
|
|
break; |
|
|
|
case Stretch.None: |
|
|
|
default: |
|
|
|
deferCalculateTransform = false; |
|
|
|
break; |
|
|
|
return default; |
|
|
|
} |
|
|
|
|
|
|
|
if (deferCalculateTransform) |
|
|
|
{ |
|
|
|
_calculateTransformOnArrange = true; |
|
|
|
return DefiningGeometry?.Bounds.Size ?? Size.Empty; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
_calculateTransformOnArrange = false; |
|
|
|
return CalculateShapeSizeAndSetTransform(availableSize); |
|
|
|
} |
|
|
|
return CalculateSizeAndTransform(availableSize, DefiningGeometry.Bounds, Stretch).Item1; |
|
|
|
} |
|
|
|
|
|
|
|
protected override Size ArrangeOverride(Size finalSize) |
|
|
|
{ |
|
|
|
if (_calculateTransformOnArrange) |
|
|
|
{ |
|
|
|
_calculateTransformOnArrange = false; |
|
|
|
CalculateShapeSizeAndSetTransform(finalSize); |
|
|
|
} |
|
|
|
|
|
|
|
return finalSize; |
|
|
|
} |
|
|
|
|
|
|
|
private Size CalculateShapeSizeAndSetTransform(Size availableSize) |
|
|
|
{ |
|
|
|
if (DefiningGeometry != null) |
|
|
|
{ |
|
|
|
// This should probably use GetRenderBounds(strokeThickness) but then the calculations
|
|
|
|
// will multiply the stroke thickness as well, which isn't correct.
|
|
|
|
var (size, transform) = CalculateSizeAndTransform(availableSize, DefiningGeometry.Bounds, Stretch); |
|
|
|
var (size, transform) = CalculateSizeAndTransform(finalSize, DefiningGeometry.Bounds, Stretch); |
|
|
|
|
|
|
|
if (_transform != transform) |
|
|
|
{ |
|
|
|
|