Как я могу контролировать порядок отображения дочерних форм в форме MDI - PullRequest
0 голосов
/ 09 ноября 2018

Когда я использую форму MDI, у меня проблема. Мой исходный код просто так:

private void menuItem1_Click(object sender, EventArgs e)
    {
        Form[] charr = this.MdiChildren;
        int i = 0;            
        foreach (Form chform in charr)
        {
            chform.Dock = DockStyle.Top;                
        }
        this.LayoutMdi(System.Windows.Forms.MdiLayout.TileHorizontal);
    }

Число дочерних форм больше 3. Чтобы правильно отображать их после вызова метода LayoutMdi(), мне пришлось установить для свойства Dock всех дочерних форм значение DockStyle.Top.

После вызова LayoutMdi(MdiLayout.TileHorizontal), щелкнув строку заголовка первой дочерней формы, эта дочерняя форма автоматически отображается внизу родительского элемента MDI.

Я хочу, чтобы дочерняя форма, на которую нажали, сохранила свою исходную позицию.
Есть ли идея по этому вопросу?

1 Ответ

0 голосов
/ 09 ноября 2018

Глядя на связанный вопрос - где было предложено установить свойство 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;
    }
}
...