Winforms 嵌套的flowlayout面板未换行

Winforms 嵌套的flowlayout面板未换行,winforms,flowlayoutpanel,Winforms,Flowlayoutpanel,我有一个具有以下属性的FlowLayoutPanel: Dock=Fill(在用户控件中) 流向=自上而下 WrapContents=false 我这样做是为了使添加到面板的每个项目都添加到底部 我添加到此面板中的项是用户控件,它们本身具有FlowLayoutPanels,但它们具有标准行为(LeftToRight,WrapContents=true)。我遇到的问题是,内部用户控件的FlowLayoutPanel没有调整大小以填充外部控件,但是当我在这些控件上将AutoSize设置为true

我有一个具有以下属性的FlowLayoutPanel:

  • Dock=Fill(在用户控件中)
  • 流向=自上而下
  • WrapContents=false
我这样做是为了使添加到面板的每个项目都添加到底部

我添加到此面板中的项是用户控件,它们本身具有FlowLayoutPanels,但它们具有标准行为(LeftToRight,WrapContents=true)。我遇到的问题是,内部用户控件的FlowLayoutPanel没有调整大小以填充外部控件,但是当我在这些控件上将AutoSize设置为true时,面板将不会包装其内容-这显然是一个已知的问题

如果它有助于形象化我正在尝试做的事情,它看起来是这样的:

______________________________ | __________________________ | Outer box = exterior flowlayout | |Text____________________| | (TopDown, NoWrap) | | # # # # # # # # # # # #| | | | # # # # | | Interior boxes = usercontrols with text and a | |________________________| | flowlayoutpanel on them | __________________________ | (LeftToRight, Wrap) | |Text____________________| | | | # # # # # # # # # # # #| | # = pictures | | # # | | | |________________________| | |____________________________| ______________________________ |_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu124;外箱=外部流程布局 ||文本uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu124; |(自上而下,NoWrap) | | # # # # # # # # # # # #| | ||####| | |内部框=带有文本和 ||uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu124; uuuuuuuuuuuuuuuuuuuuu124;流布局面板 |_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu124;(左向右,环绕) ||文本| | | | | | | | | | | | | | | | |图片 | | # # | | | |________________________| | |____________________________|
我不认为您可以将控件停靠在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);
        }
    }
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
TableLayoutPanel tlp1=新的TableLayoutPanel();
this.Controls.Add(tlp1);
tlp1.Dock=DockStyle.Fill;
对于(int i=0;i<5;i++)
{
UserControl1 uc=新的UserControl1();
uc.Dock=DockStyle.Top;
tlp1.控件.添加(uc);
}
}
}
在本例中,UserControl1是一个用户控件,上面有一个FLP,其中有一系列按钮,因此我可以确认停靠和流动是否有效