FlowLayoutPanel使用AutoSize时的高度错误

我有一个表格,其中包含一个包含1列和3行的TableLayout,其中包含2个FlowLayoutPanel和一个文本框。 所有行都是AutoSize,列设置为Percentage = 100%。

每个FlowLayoutPanel都包含多个TextBox。 设置FlowLayoutPanel:LeftToRight,AutoSize = true,GrowAndShrink,Docking = Fill。

大纲是:

Form TableLayout (Dock=Fill) FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink) More controls FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink) More controls TextBox(Dock=Fill, MultiLine=true) 

问题是如果我将FlowLayoutPanel放在GroupBox中并且也设置为AutoSize = true,则FlowLayoutPanel高度未正确设置并且它在1行中显示TextBoxes,从表单中剪切一些TextBox。

大纲是:

 Form TableLayout (Dock=Fill) GroupBox (Dock=Fill, AutoSize=True, GrowShrink) FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink) More controls GroupBox (Dock=Fill, AutoSize=True, GrowShrink) FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink) More controls TextBox(Dock=Fill, MultiLine=true) 

顺便说一句,如果我使用GroupBox,Panel或者甚至是UserControl来保存FlowLayoutPanel,也会发生同样的事情。

BTW 2,即使没有TableLayout也会发生这种情况。 我尝试将GroupBox(带有FlowLayoutPanel)放在AutoSized表单上,我得到了相同的行为。

我认为问题是当FlowLayoutPanel在另一个也是AutoSized的容器中时,它无法传递给它的容器是首选大小。

可以做些什么来覆盖这个bug?

请帮助谢谢,Yoram


ps:我必须使用GroupBox在TextBoxes周围有一个漂亮的框架。

我也遇到过这个问题,并试图找出如何轻松解决这个问题。 虽然@ GertArnold的答案确实有帮助,但感觉有点麻烦,我寻找另一个解决方案。

我发现Flow Panel的自动调整逻辑正在处理“最小”要求,并且通过添加一个最小高度的空白面板,我能够强制Flow Panel的宽度,从而使所有其他子控件都可见。

所以在上面的例子中,最终的布局是:

 Form TableLayout (Dock=Fill) GroupBox (Dock=Fill, AutoSize=True, GrowShrink) FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink) Panel(Dock=Fill, Height = 1, MinimumSize = new System.Drawing.Size( Form.ClientSize.Width - TableLayout.Padding.Horizontal, 1)) More controls GroupBox (Dock=Fill, AutoSize=True, GrowShrink) FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink) Panel(Dock=Fill, Height = 1, MinimumSize = new System.Drawing.Size( Form.ClientSize.Width - TableLayout.Padding.Horizontal, 1)) More controls TextBox(Dock=Fill, MultiLine=true) 

希望这可以帮助。

当您将FlowLayoutPanel停靠在GroupBox (或其他容器)中时,您可以将其AutoSize=false保留。 我不确定,但这可能会使groupbox在resize时成为“领先”控件。


编辑 (评论后)

“领先控制”是我试图表达群组大小将决定FLP的那个,这不是一些官方术语。 问题在于对接和自动调节本质上是相互争斗的 ,有人应该采取控制。 这只能在减少对接和自动调整时通过自己编程resize事件来完成。

玩了一下之后我终于想出了这个模型:

 Form TableLayout (Dock=Fill) GroupBox () FlowLayoutPanel(Dock=Fill) More controls 

和resize事件:

 private void Form1_Resize(object sender, EventArgs e) { this.SuspendLayout(); this.groupBox.Width = this.Width - 20; this.groupBox.Height = this.flowLayoutPanel.GetPreferredSize(this.groupBox.Size).Height + 20; this.ResumeLayout(); } 

我希望我能理解你。 至少这可能会指向正确的方向。