首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用FlowLayoutPanel时AutoSize高度错误

使用FlowLayoutPanel时AutoSize高度错误
EN

Stack Overflow用户
提问于 2011-10-04 11:35:34
回答 3查看 10.6K关注 0票数 5

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

每个FlowLayoutPanel包含几个TextBoxes。FlowLayoutPanels设置为: LeftToRight、AutoSize=true、GrowAndShrink、Docking=Fill。

大纲是:

代码语言:javascript
复制
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放置在一个也被设置为AutoSize=true的GroupBox中,那么FlowLayoutPanel的高度将不能正确设置,并且它会在一行中显示TextBoxes,将一些TextBoxes从表单中删除。

大纲是:

代码语言:javascript
复制
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、面板甚至UserControl来保存FlowLayoutPanel,也会发生同样的事情。

顺便说一句,即使没有TableLayout,也会发生这种情况。我尝试将GroupBox (与FlowLayoutPanel一起)放置在AutoSized表单上,并得到了相同的行为。

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

怎样才能覆盖这个bug??

谢谢你,约兰

p.s:我必须使用GroupBox在TextBoxes周围有一个很好的框架。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-13 05:57:18

也遇到了这个问题,并试图找出如何轻易解决这一问题。尽管@GertArnold的回答确实有帮助,但它觉得有点麻烦,于是我寻找了另一个解决方案。

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

因此,在上面的示例中,最终的布局是:

代码语言:javascript
复制
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)

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2011-10-04 21:13:04

当您将FlowLayoutPanel停靠在GroupBox (或其他容器)中时,您最好离开它们的AutoSize=false。我不确定,但这可能会使groupbox在调整大小时成为“领先”控件。

编辑(在您的评论之后)

‘引导控制’是我的话,试图表达的群盒大小将决定的FLP,这不是什么官方术语。问题是,对接和自动大小是天生就互相争斗,有人应该采取,嗯,控制。这只能在减少对接和自动调整大小以及自己编程调整大小事件时才能完成。

在玩了一会儿之后,我终于想出了一个模型:

代码语言:javascript
复制
Form
    TableLayout (Dock=Fill)
        GroupBox () 
            FlowLayoutPanel(Dock=Fill)
               More controls

以及调整大小事件:

代码语言:javascript
复制
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();
}

希望我能很好地理解你。至少这可能会给你指明正确的方向。

票数 2
EN

Stack Overflow用户

发布于 2019-10-08 09:31:28

很抱歉迟到了,但是我想建议您最好简单地计算FlowLayoutPanels及其父级的高度,而不是使用格特·阿诺德的回答作为他的方法,使GetPreferredSize()在删除子Control时返回一个Height等于“单行”--即使仍然需要两行(至少在我的情况下)。

代码语言:javascript
复制
public YodaUserControl
{
  InitializeComponent();
  InitialHeight = parentOfFlp.Height;
}

private int InitialHeight { get; }

private void OnAdded(object sender, ControlEventArgs args)
  => RefreshHeight();

private void OnRemoved(object sender, ControlEventArgs args)
  => RefreshHeight();

private void OnSizeChanged(object sender, EventArgs args)
  => RefreshHeight();

private void RefreshHeight()
{
  if (flpYoda.Controls.Count > 1
      && flpYoda.Controls[0] is Control control)
  {
    parentOfFlpYoda.Height = flpYoda.Height =
      InitialHeight * (int)Math.Ceiling(
        flpYoda.Controls.Count / Math.Floor(
          flpYoda.ClientSize.Width / (double)control.Width));
  }
}

备注:

  • 当然,您必须用相应的名称替换YodaUserControlparentOfFlpYodaflpYoda
  • OnAddedOnRemovedOnSizeChanged需要附加到flpYoda的相应ControlAddedControlRemovedSizeChanged事件。

如果您需要进一步的帮助,请通过评论告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7647244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档