private void UpdateComputedValues()
{
ComputedColumns = Columns;
ComputedRows = Rows;
// Reset the first column. This is the same logic performed by WPF.
if (FirstColumn >= ComputedColumns)
{
FirstColumn = 0;
}
if ((ComputedRows == 0) || (ComputedColumns == 0))
{
int nonCollapsedCount = 0;
for (int i = 0, count = Children.Count; i < count; ++i)
{
UIElement child = Children[i];
if (child.Visibility != Visibility.Collapsed)
{
nonCollapsedCount++;
}
}
if (nonCollapsedCount == 0)
{
nonCollapsedCount = 1;
}
if (ComputedRows == 0)
{
if (ComputedColumns > 0)
{
ComputedRows = (nonCollapsedCount + FirstColumn + (ComputedColumns - 1)) / ComputedColumns;
}
else
{
ComputedRows = (int)Math.Sqrt(nonCollapsedCount);
if ((ComputedRows * ComputedRows) < nonCollapsedCount)
{
ComputedRows++;
}
ComputedColumns = ComputedRows;
}
}
else if (ComputedColumns == 0)
{
ComputedColumns = (nonCollapsedCount + (ComputedRows - 1)) / ComputedRows;
}
}
}