Проблемы с FlowLayoutPanel

Мне очень сложно работать с FlowLayoutPanel.

У меня есть приложение Winforms с FLP (FlowLayoutPanel) с одним дочерним элементом управления - tabControl (с веб-браузером в нем). Форма также имеет прикрепленную сверху TableLayoutPanel и еще одну TableLayoutPanel снизу. Итак, я намерен заполнить пространство между этими TLP с помощью FlowLayoutPanel. Все элементы управления добавляются в форму в режиме конструктора.

Что мне нужно - когда я изменяю размер формы, FLP должен хорошо изменять размер вместе с ним, заполняя форму, и tabControl также должен заполнять FLP.

Форма настроена на работу в развернутом виде, поэтому первое изменение размера происходит по умолчанию, когда я запускаю приложение - в этот момент FLP и его элемент управления не меняют размер, если я специально не сообщу им об этом в обработчике событий Form_Layout.

Проблема в том, что независимо от того, какую комбинацию изменений размера, якорей и док-станций я пробую в этом обработчике событий, всегда верхняя или нижняя часть tabControl находится вне области формы, и я не вижу полную полосу прокрутки веб-браузера. в этом; поэтому элемент управления вкладкой неправильно закреплен внутри FLP (или FLP не закреплен в форме), даже если я скажу, что это так. Вот код Form_layout:

private void MyForm_Layout(object sender, LayoutEventArgs e)
{
    //resize FLP
    pnlMainFlowLayout.Size = this.Size - new Size(15, 0);
    pnlMainFlowLayout.Dock = DockStyle.Fill;
    pnlMainFlowLayout.BringToFront();

    //resize child control of FLP
    tabControl.Size = pnlMainFlowLayout.Size;
    tabControl.BringToFront();
}

Мне действительно нужно понять поведение FlowLayoutPanel при изменении размера.


person Amc_rtty    schedule 12.09.2010    source источник
comment
Если у вас есть только один элемент управления в FlowLayoutPanel, не было бы проще просто заменить FlowLayoutPanel на TabControl с его Dock, установленным на DockStyle.Fill?   -  person Patrick    schedule 12.09.2010
comment
Спасибо за ваш комментарий, я выбрал FLP, потому что, хотя он содержит один элемент управления, добавленный в режиме разработки, во время выполнения (если установлен определенный параметр) он также добавляет другие элементы управления рядом с tabControl.   -  person Amc_rtty    schedule 12.09.2010


Ответы (2)


Нет смысла использовать FLP, если он содержит только один элемент управления. Его работа состоит в том, чтобы перемещать элементы управления внутри него, ничего не перемещать, если есть только один.

Используйте TabControl как есть, установите для его свойства Dock значение Fill. Если это приводит к перекрытию одного из TLP, щелкните правой кнопкой мыши TLP и выберите «Отправить на задний план».

person Hans Passant    schedule 12.09.2010

При использовании закрепления важен порядок, в котором элементы управления добавляются к родительскому элементу. Элемент управления, добавленный первым, имеет более высокий приоритет. Этот приоритет может привести к описанным вами эффектам.

Чтобы обеспечить правильное поведение при стыковке, выберите один из элементов управления, закрепленных вверху или внизу, и скажите отправить их в фоновый режим. Затем выберите другой элемент управления и сделайте то же самое. Обычно это решает подобные проблемы.

Интересно, почему вы используете потоковый макет для визуализации страницы с одной вкладкой, не лучше ли разместить tabControl прямо на вашей форме и установить для Dock значение Fill?

person AxelEckenberger    schedule 12.09.2010
comment
Спасибо за ответ, попробую то, что вы предложили. Я выбрал flowLayoutPanel, потому что, в зависимости от настроек приложения, мне нужно динамически сжимать и другие элементы управления в этом FLP, рядом с tabControl. - person Amc_rtty; 12.09.2010