c # / winforms: Как два элемента управления динамически распределяют доступное пространство? - PullRequest
7 голосов
/ 18 мая 2009

Как мне настроить мои элементы управления для следующей ситуации?:

У меня есть родительский контейнер, например GroupBox.

Внутри этого родительского контейнера у меня есть два аналогичных элемента управления, например ListBox es, рядом друг с другом. Они оба имеют одинаковый размер, поэтому граница между ними точно посередине GroupBox.

Теперь, когда размер GroupBox изменен, я хочу, чтобы размеры ListBox также были изменены, но оба должны всегда иметь тот же размер, что и другой. Таким образом, граница между ними остается в середине GroupBox.

Итак, как мне настроить свойства этих трех элементов управления для достижения желаемого поведения?

Ответы [ 3 ]

14 голосов
/ 18 мая 2009

Вам нужен еще один контейнер. TableLayoutPanel является лучшим решением. Используйте 1 строку и 2 столбца и вставьте (Dock = Fill) в групповое поле. Ширина обоих столбцов должна быть установлена ​​на 50%. Затем вы можете добавить свои элементы управления в отдельные ячейки и закрепить их (Dock = Fill)

3 голосов
/ 18 мая 2009

Возможно, SplitContainer с двумя половинами, установленными равномерно, и IsSplitterFixed, установленными на true (чтобы пользователь не перемещал его):

[STAThread]
static void Main() {
    Application.EnableVisualStyles();
    Application.Run(new Form {
        Controls = { new SplitContainer {
            Width = 200,
            IsSplitterFixed = true,
            SplitterDistance = 100,
            SplitterWidth = 1,
            Dock = DockStyle.Fill,
            Panel1 = { Controls = {
                    new ListBox {
                        IntegralHeight = false,
                        Dock = DockStyle.Fill,
                        BackColor = Color.Blue,
                        Items = {"abc","def","ghi"}
                    }
                }
            }, Panel2 = { Controls = {
                    new ListBox {
                        Dock = DockStyle.Fill,
                        BackColor = Color.Red,
                        IntegralHeight = false,
                        Items = {"jkl","mno","pqr"}
                    }
                }
            }
        }}
    });        
}
1 голос
/ 18 мая 2009

Возможно также без сплитконтейнера.

В событии изменения размера группового блока установите расположение первого элемента управления {0,0}, а второго - {GroupBox.Width / 2,0} и установите размеры обоих элементов равными {GroupBox.Width / 2, GroupBox.Height}

Вы также должны оставить пространство вокруг элементов управления, чтобы они не пересекались с границей GroupBox.

private void groupBox1_Resize(object sender, EventArgs e)
{
    groupBox1.SuspendLayout();

    listBox1.Location = new Point(7, 20);
    listBox2.Location = new Point(groupBox1.Width / 2, 20);

    listBox1.Size = new Size(groupBox1.Width / 2 - 6, groupBox1.Height - 27);
    listBox2.Size = new Size((groupBox1.Width + 1) / 2 - 6, groupBox1.Height - 27);

    groupBox1.ResumeLayout();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...