Мне не удалось воспроизвести проблему, которую вы описали. Не могли бы вы предоставить пример кода / xaml, чтобы я мог посмотреть?
UPDATE:
Я считаю, что проблема в том, что вы возвращаете (0,0) как DesiredSize панели из MeasureOverride. Вы, вероятно, хотите сделать что-то вроде:
protected override Size MeasureOverride(Size availableSize)
{
double width = 0;
double height = 0;
foreach (UIElement child in this.Children)
{
if (child != null)
{
child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
width = Math.Max(width, child.DesiredSize.Width);
height = Math.Max(height, child.DesiredSize.Height);
}
}
return new Size(width, height);
}
Фактическая логика калибровки может отличаться в зависимости от ваших требований.
То, что происходит в вашем коде, заключается в том, что, возвращая (0,0) из MeasureOverride, ваша Panel, по сути, «запрашивает» у своего родителя этот объем пространства, который будет зарезервирован для него. Поэтому, когда дело доходит до фазы Arrange цикла макета, finalSize, переданный в ArrangeOverride, очень мал (0 по крайней мере в одном измерении). В этом можно убедиться, установив точку останова в ArrangeOverride, а затем изучив параметр finalSize. Чтобы ваш код работал корректно с системой макетов, вам нужно вернуть из MeasureOverride минимальный объем пространства, необходимого вашей Panel для хранения его дочерних элементов.