Механизм DefaultLayout для WindowsForms содержит довольно немного логики для размещения закрепленных элементов управления. Я бы порекомендовал декомпилятор (dotPeek, Reflector и т. Д.) И декомпилировал класс DefaultLayout.
Существует много взаимодействий между самим элементом управления, его дочерними элементами, переопределяет ли он GetPreferredSize и т. Д. И т. Д.
Возможно, когда вы поймете контекст, в котором вызывается ваш GetPreferredSize, вы получите лучшее представление о том, как его реализовать.
С точки зрения примеров реализации, опять же, что может быть лучше, чем сами элементы управления Windows? Декомпилируй несколько. Вот пример из ToolStripItem
public virtual Size GetPreferredSize(Size constrainingSize)
{
constrainingSize = LayoutUtils.ConvertZeroToUnbounded(constrainingSize);
return this.InternalLayout.GetPreferredSize(constrainingSize - this.Padding.Size) + this.Padding.Size;
}
Удачи!