Children 似乎不想按预期填充 FlowLayout (C#)

Children don't seem to want to fill the FlowLayout as expected (C#)

我是 C# 的新手,可能遗漏了一些明显的东西。我只找到一个相关的问题here,而且不完全匹配,也不很权威

我想要的是让我可以将控件停靠在 FlowLayout(设置 left-to-right)中,这样它将填充整个垂直 space,并且当用户调整大小时窗体、控件调整大小以继续填充整个垂直 space。这可以做到吗?如果可以,怎么做?

我发现了什么:

我创建了一个表单。我把它涂成了红色。我添加了一个 FlowLayout,我将其涂成绿色并设置 Dock 以填充表单。这似乎有效(表格现在全是绿色,看不到红色)。

然后我将几个控件添加到 FlowLayout(即 运行 left-to-right)。如果我将它们停靠在顶部,它会按预期工作。如果我将它们停靠在底部,则与顶部相同;暗示垂直 space 并不是真正的整个绿色区域。向左、向右或填充组件根本不会出现,除非我给它们设置最小尺寸 > 0。

我有一些代码可以说明我的意思;我为其中一个控件添加了一些尺寸,可以看出这似乎调整到允许的最小垂直尺寸。包含输出屏幕截图。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ViewData
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            CustomComponentLayout();
        }

        private void CustomComponentLayout()
        {
            FlowLayoutPanel pnlHorFlow;
            pnlHorFlow = new FlowLayoutPanel();
            this.Controls.Add(pnlHorFlow);
            pnlHorFlow.Dock = DockStyle.Fill;
            pnlHorFlow.BackColor = Color.Green;

            // Add a panel with some size
            Panel testPanel = new Panel();
            testPanel.Dock = DockStyle.Fill;
            testPanel.BackColor = Color.BlanchedAlmond;
            // Need these to get anything            
            testPanel.MinimumSize = new Size(200, 400);
            pnlHorFlow.Controls.Add(testPanel);

            Button testButton;
            testButton = new Button();
            testButton.Text = "Test";
            testButton.Anchor = AnchorStyles.Top & AnchorStyles.Bottom;
            testButton.Dock = DockStyle.Left;
            pnlHorFlow.Controls.Add(testButton);
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

编辑

好的,所以下面的答案没有回答问题,但我已经接受了,因为我现在确信答案是 FlowLayoutPanel 无法做到这一点。答案(至少是编辑)与我得到的差不多。使用 TableLayoutPanel 似乎是获得我需要的唯一方法。

对于这条船上的人,我还发现 this 有帮助。

我发现很多人和我一样对 FlowLayoutPanel 做出了同样的错误假设。我认为在我的情况下它是因为我有 Java 背景,并且 FlowLayouts 在 Java 中的工作方式不同。

这里是一个使用AnchorStyles.Right的例子:

public class FlowForm2 : Form {

    public FlowForm2() {
        Button btn1 = new Button { Text = "ABCDEFGHIJKLMNOPQRSTUVWXYZ", AutoSize = true };
        Button btn2 = new Button { Text = "ABCD", AutoSize = true };
        btn2.Anchor = AnchorStyles.Right;

        FlowLayoutPanel p = new FlowLayoutPanel { Dock = DockStyle.Fill, FlowDirection = FlowDirection.TopDown, WrapContents = false };
        p.Controls.Add(btn1); // if btn1 isn't added, then btn2 appears on the LEFT side
        p.Controls.Add(btn2); // however, if btn1 is added, then btn2 is right justified with the right edge of btn2

        Controls.Add(p);
    }
}

编辑:

创建所需布局的最简单方法是:

public class TLPForm : Form {

    TableLayoutPanel p = new TableLayoutPanel { Dock = DockStyle.Fill };

    public TLPForm() {
        var style = AnchorStyles.Top | AnchorStyles.Bottom;
        Button btn1 = new Button { Text = "ABCDEFGHIJKLMNOPQRSTUVWXYZ", AutoSize = true, AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink, Anchor = style };
        Button btn2 = new Button { Text = "ABCD", AutoSize = true, AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink, Anchor = style };
        Button btn3 = new Button { Text = "ABCD", AutoSize = true, AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink, Anchor = style };
        p.Controls.Add(btn1, 0, 0);
        p.Controls.Add(btn2, 1, 0);
        p.Controls.Add(btn3, 2, 0);
        p.Controls.Add(new Control(), 3, 0); // <-- takes up the rest of the space
        Controls.Add(p);
    }
}