Browse Source

Limit RelativePanel height and width in case when available size is infinite.

pull/8727/head
Stanislav Silin 4 years ago
parent
commit
c8900ec3d2
  1. 25
      src/Avalonia.Controls/RelativePanel.cs

25
src/Avalonia.Controls/RelativePanel.cs

@ -36,7 +36,10 @@ namespace Avalonia.Controls
foreach (Layoutable child in Children)
{
if (child == null)
{
continue;
}
var node = _childGraph.AddNode(child);
node.AlignLeftWithNode = _childGraph.AddLink(node, GetDependencyElement(AlignLeftWithProperty, child));
@ -51,17 +54,18 @@ namespace Avalonia.Controls
node.AlignHorizontalCenterWith = _childGraph.AddLink(node, GetDependencyElement(AlignHorizontalCenterWithProperty, child));
node.AlignVerticalCenterWith = _childGraph.AddLink(node, GetDependencyElement(AlignVerticalCenterWithProperty, child));
}
_childGraph.Measure(availableSize);
_childGraph.Reset(false);
var calcWidth = Width.IsNaN() && HorizontalAlignment != HorizontalAlignment.Stretch;
var calcHeight = Height.IsNaN() && VerticalAlignment != VerticalAlignment.Stretch;
var calcWidth = Width.IsNaN() && (HorizontalAlignment != HorizontalAlignment.Stretch);
var calcHeight = Height.IsNaN() && (VerticalAlignment != VerticalAlignment.Stretch);
var boundingSize = _childGraph.GetBoundingSize(calcWidth, calcHeight);
_childGraph.Reset();
_childGraph.Measure(boundingSize);
return boundingSize;
}
@ -171,6 +175,7 @@ namespace Avalonia.Controls
prevSize = prevSize.WithWidth(prevSize.Width + prevNode.OriginDesiredSize.Width);
prevNode.HorizontalOffsetFlag = true;
}
if (node.VerticalOffsetFlag)
{
prevNode.VerticalOffsetFlag = true;
@ -186,6 +191,7 @@ namespace Avalonia.Controls
prevSize = prevSize.WithHeight(prevSize.Height + node.OriginDesiredSize.Height);
prevNode.VerticalOffsetFlag = true;
}
if (node.HorizontalOffsetFlag)
{
prevNode.HorizontalOffsetFlag = true;
@ -269,16 +275,16 @@ namespace Avalonia.Controls
MeasureChild(node);
continue;
}
if (node.OutgoingNodes.All(item => item.Measured))
{
MeasureChild(node);
continue;
}
if (!set.Add(node.Element))
throw new Exception("RelativePanel error: Circular dependency detected. Layout could not complete.");
Measure(node.OutgoingNodes, set);
if (!node.Measured)
@ -507,8 +513,11 @@ namespace Avalonia.Controls
boundingSize = boundingSize.WithHeight(Math.Max(boundingSize.Height, size.Height));
}
boundingSize = boundingSize.WithWidth(calcWidth ? boundingSize.Width : AvailableSize.Width);
boundingSize = boundingSize.WithHeight(calcHeight ? boundingSize.Height : AvailableSize.Height);
var availableWidth = double.IsInfinity(AvailableSize.Width) ? boundingSize.Width : AvailableSize.Width;
var availableHeight = double.IsInfinity(AvailableSize.Height) ? boundingSize.Height : AvailableSize.Height;
boundingSize = boundingSize.WithWidth(calcWidth ? boundingSize.Width : availableWidth);
boundingSize = boundingSize.WithHeight(calcHeight ? boundingSize.Height : availableHeight);
return boundingSize;
}
}

Loading…
Cancel
Save