Глядя на связанный вопрос - где было предложено установить свойство Dock
для настройки положения MDIChild
форм - и текущее поведение, о котором сообщается, вероятно, предпочтительнее определить макет форм MDIChild
без помощь автоматической функции.
Это позволяет выполнять любую логику макета, которая кажется подходящей.
В этом примере MDIChildren.Height
вычисляется по отношению к MDIParent.ClientSize.Height
и количеству открытых MDIChildren
, затем умножается на значения: в примере кода на 2, вдвое больше базовой меры.
Этот множитель позволяет довольно точно определить Horizontal Tile Height
из MDICHildren
. Конечно, вы могли бы реализовать некоторую другую логику, которая применяет множитель, только когда открыто по крайней мере 3 MDIChildren
.
Все MDIChildren
масштабируются в соответствии с MDIParent.Width
и рассчитанным Height
, затем упорядочиваются по имени и располагаются сверху вниз.
Установите различные значения HorizontalTileHeightMultiplier
, чтобы увидеть, как MDIChildren
позиционируется в MDIParent.ClientArea
(MdiClient
).
Этот множитель также можно использовать в качестве пользовательского свойства в приложении, доступного для его пользователей, что позволяет настраивать тайлы форм.
Код макета предоставляется как частный метод, поэтому его можно легко использовать в различных обработчиках событий для выполнения / поддержки выбранного макета (например, MDIParent.Resize
).
Этот метод также может быть легко адаптирован для замены MdiLayout.TileVertical
при необходимости.
private float HorizontalTileHeightMultiplier = 2;
private void menuItem1_Click(object sender, EventArgs e)
{
TileHorizontal()
}
private void TileHorizontal()
{
int OpenedForms = Application.OpenForms.Count - 1;
if (OpenedForms < 2) return;
int StartLocation = 0;
int ChildrenHeight =
(int)((this.ClientSize.Height / OpenedForms) * HorizontalTileHeightMultiplier);
List<Form> children = this.MdiChildren.OrderBy(f => f.Name).ToList();
foreach (Form child in children)
{
child.Size = new Size(this.ClientSize.Width - SystemInformation.VerticalScrollBarWidth - 4, ChildrenHeight);
child.Location = new Point(0, StartLocation);
StartLocation += ChildrenHeight;
}
}