Требуется алгоритм компоновки, который измеряет другие элементы с ограничением высоты, равным требуемой высоте конкретного.Хотя некоторые из существующих реализаций Panel уменьшат доступное пространство для оставшихся элементов в зависимости от размера, используемого предыдущими, ни одна из них не установит ограничение так, как вы хотите.Если вы хотите описать поведение, которое вы описываете за один проход макета, вам нужно написать собственный алгоритм макета.
Например, вы можете приблизиться, переопределив поведение StackPanel следующим образом:
public class SizeToFirstChildStackPanel
: StackPanel
{
protected override Size MeasureOverride(Size constraint)
{
if (Children.Count > 0)
{
var firstChild = Children[0];
firstChild.Measure(constraint);
if (Orientation == Orientation.Horizontal)
{
constraint = new Size(
constraint.Width,
Math.Min(firstChild.DesiredSize.Height, constraint.Height));
}
else
{
constraint = new Size(
Math.Min(firstChild.DesiredSize.Width, constraint.Width),
constraint.Height);
}
}
return base.MeasureOverride(constraint);
}
}
Это ограничит высоту всех дочерних элементов StackPanel до желаемой высоты первого из них.(или ширина, если панель ориентирована вертикально).
Это все еще не идеально, потому что первый дочерний элемент будет измерен во второй раз базовым классом MeasureOverride, а второй показатель будет иметь ограничение.Это дополнительная работа, которая вызовет странное поведение, если первый ребенок захочет стать больше.
Чтобы сделать это правильно, вам нужно самостоятельно реализовать весь метод метода MeasureOverride.Я не собираюсь делать это здесь, потому что это будет много кода, который на самом деле не имеет отношения к проблеме, и это зависит от того, как именно вы хотите, чтобы макет работал.Важный момент заключается в том, чтобы сначала измерить определенный элемент и использовать его DesiredSize, чтобы определить доступный размер при вызове Measure для других.