FlowLayoutPanel自动包装不适用于自动调整大小

时间:2009-09-24 11:28:05

标签: c# winforms flowlayoutpanel

.NET Framework / C#/ Windows窗体

我希望FlowLayoutPanel根据其中的控件数量自动调整其宽度或高度。如果没有足够的空间(包装其内容),它也应该更改列数/行数。问题是,如果我设置自动调整大小,那么flowlayoutpanel不会包装我插入的控件。哪种解决方案最好?

谢谢!

6 个答案:

答案 0 :(得分:2)

将FlowLayoutPanel的MaximumSize设置为您要包装的宽度。设置WrapContents = true。

答案 1 :(得分:1)

您是否尝试过使用TableLayoutPanel?将控件放在单元格中非常有用。

答案 2 :(得分:1)

在软件开发中没有不可能的事情。不可能只需要更长时间。

我调查了这个问题。如果确实需要Flow Layout,可以通过一些工作来完成。由于FlowLayoutPanel布局控件而不考虑行/列的数量,而是考虑累积宽度/高度,因此您可能需要跟踪已添加的控件数量。首先,将autosize设置为false,然后将您自己的大小管理逻辑挂钩到ControlAdded / ControlRemoved事件。我们的想法是以这种方式设置面板的宽度和高度,以便在那里获得所需数量的“列”

肮脏的概念证据:

private void flowLayoutPanel1_ControlAdded(object sender, ControlEventArgs e)
    {
        int count = this.flowLayoutPanel1.Controls.Count;
        if (count % 4 == 0)
        {
            this.flowLayoutPanel1.Height = this.flowLayoutPanel1.Height + 70;
        }
    }

如果面板最初具有4个控件的宽度,则会为新控件生成行。 ControlRemoved处理程序应检查相同并降低面板高度,或获取所有包含的控件并再次放置它们。你应该考虑一下,它可能不是你想要的那种东西。这取决于使用场景。所有控件的尺寸是否相同?如果没有,你需要更复杂的逻辑。

但实际上,考虑表格布局 - 您可以将其包装在辅助类中,或从中获取新控件,您可以在其中解析所有控件放置逻辑。 FlowLayout可以轻松添加和删除控件,但随后大小管理代码就可以了.TableLayout为行和列提供了一个很好的机制,管理宽度和高度更容易,但是你需要更多的代码来改变所有的位置控制是否要动态地从表单中删除一个。

答案 3 :(得分:1)

如果可能的话,我建议你重新调整FlowLayoutPanel的大小,使它利用所有可用的宽度,然后将它锚定在Top,Left和Right。这样可以根据需要增加高度,同时仍然包裹控件。

答案 4 :(得分:0)

您是否根据用户的操作动态添加控件?我担心你需要在代码中动态更改FlowLayout属性,当向它添加新控件时,然后刷新表单就可以了。

答案 5 :(得分:0)

我知道这是一个旧线程,但是如果其他人对此感到奇怪,那么这就是我产生的解决方案-在面板上将autosize设置为true,并从流面板的Resize事件中调用此扩展方法:

public static void ReOrganise(this FlowLayoutPanel panel)
{
    var width = 0;
    Control prevChildCtrl = null;

    panel.SuspendLayout();

    //Clear flow breaks
    foreach (Control childCtrl in panel.Controls)
    {
        panel.SetFlowBreak(childCtrl, false);
    }

    foreach (Control childCtrl in panel.Controls)
    {
        width = width + childCtrl.Width;

        if(width > panel.Width && prevChildCtrl != null)
        {
            panel.SetFlowBreak(prevChildCtrl, true);
            width = childCtrl.Width;
        }

        prevChildCtrl = childCtrl;
    }

    panel.ResumeLayout();
}