Вы всегда можете написать свою собственную панель с различными правилами стыковки. Вы можете использовать стандартную реализацию DockPanel (доступную в исходном коде фреймворка - она не выглядит очень сложной) и создать нечто похожее с правилами, которые вы предпочитаете. Возможно, вы даже сможете создать класс, производный от DockPanel и переопределяющий ArrangeOverride.
Но лично я бы просто использовал панель док-станции, которая делает именно то, что вы хотите, за исключением того, что вам не нравятся ее правила о том, какой член получает право на заполнение.
Сетка IME имеет ужасную проблему с обслуживанием, если вы вставляете / удаляете строки, поскольку вы обнаруживаете, что бесконечно корректируете номера строк - DockPanel в этом отношении намного проще.
Обновление:
Вот, пожалуйста, я отказал вам в удовольствии сделать это самостоятельно - это просто урезанная / перевернутая версия исходного кода фреймворка:
public class BottomDockingPanel : DockPanel
{
protected override Size ArrangeOverride(Size arrangeSize)
{
UIElementCollection children = InternalChildren;
int totalChildrenCount = children.Count;
double accumulatedBottom = 0;
for (int i = totalChildrenCount-1; i >=0 ; --i)
{
UIElement child = children[i];
if (child == null) { continue; }
Size childDesiredSize = child.DesiredSize;
Rect rcChild = new Rect(
0,
0,
Math.Max(0.0, arrangeSize.Width - (0 + (double)0)),
Math.Max(0.0, arrangeSize.Height - (0 + accumulatedBottom)));
if (i > 0)
{
accumulatedBottom += childDesiredSize.Height;
rcChild.Y = Math.Max(0.0, arrangeSize.Height - accumulatedBottom);
rcChild.Height = childDesiredSize.Height;
}
child.Arrange(rcChild);
}
return (arrangeSize);
}
}