Вложенная панель потока не оборачивается - PullRequest
1 голос
/ 25 марта 2010

У меня есть FlowLayoutPanel со свойствами:

  • Dock = Fill (в пользовательском контроле)
  • FlowDirection = TopDown
  • WrapContents = false

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

Элементы, которые я добавляю в эту панель, являются пользовательскими элементами управления, на которых есть FlowLayoutPanels, однако они имеют стандартное поведение (LeftToRight, WrapContents = true). Проблема, с которой я столкнулся, заключается в том, что внутренняя переменная FlowLayoutPanel пользовательского элемента управления не изменяет размеры, чтобы заполнить внешний элемент управления, но когда я установил для этих элементов управления значение autosizing в true, панель не будет переносить свое содержимое, что, очевидно, является известной проблемой ,

Если это помогает визуализировать то, что я пытаюсь сделать, это выглядит так:

    ______________________________
    | __________________________ | Outer box = exterior flowlayout 
    | |Text____________________| |    (TopDown, NoWrap)
    | | # # # # # # # # # # # #| |
    | | # # # #                | | Interior boxes = usercontrols with text and a 
    | |________________________| |   flowlayoutpanel on them 
    | __________________________ |    (LeftToRight, Wrap)
    | |Text____________________| |   
    | | # # # # # # # # # # # #| |   # = pictures
    | | # #                    | |
    | |________________________| |
    |____________________________|

1 Ответ

0 голосов
/ 26 марта 2010

Я не думаю, что вы можете закрепить элементы управления в FlowLayoutPanel, если вы не создадите подкласс LayoutEngine и не создадите свою собственную версию панели, используя свой собственный движок. Тем не менее, есть отличное решение этой проблемы. Используйте TableLayoutPanel! Поскольку вам нужен только один столбец, для этой цели очень легко использовать TableLayoutPanel.

Единственное предостережение в том, что TLP изначально должен иметь 0 строк, а затем вы программно добавляете пользовательские элементы управления. И хитрость в том, чтобы закрепить пользовательский элемент управления наверху. Это работает:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        TableLayoutPanel tlp1 = new TableLayoutPanel();
        this.Controls.Add(tlp1);
        tlp1.Dock = DockStyle.Fill;

        for (int i = 0; i < 5; i++)
        {
            UserControl1 uc = new UserControl1();
            uc.Dock = DockStyle.Top;
            tlp1.Controls.Add(uc);
        }
    }
}

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

...