public void UpdateLayout()
{
while (measureQueue.Count > 0 || arrangeQueue.Count > 0)
{
while (measureQueue.Count > 0)
{
UIElement element = GetTopElement(measureQueue);
Size previousDesiredSize = element.DesiredSize;
element.Measure(element.PreviousAvailableSize);
if (previousDesiredSize != element.DesiredSize)
{
element.InvalidateArrange();
element.InvalidateParentMeasure();
}
}
while (arrangeQueue.Count > 0)
{
UIElement element = GetTopElement(arrangeQueue);
element.Arrange(element.PreviousFinalRect);
}
while (updatedElements.Count > 0 && measureQueue.Count == 0 && arrangeQueue.Count == 0) // LayoutUpdated can invalidate other elements
{
UIElement element = updatedElements.First();
updatedElements.Remove(element);
element.RaiseLayoutUpdated();
}
}
}