孩子们似乎不想按预期填写FlowLayout(C#)

时间:2015-10-26 07:39:02

标签: c# winforms user-interface layout user-controls

我是C#的新手,可能会遗漏一些明显的东西。我发现只有一个相关的问题here,这不是完全匹配,也不是非常权威。

我想要的是让它可以将一个控件停靠在FlowLayout中(从左到右设置),以便它将填充整个垂直空间,当用户调整Form的大小时,控件会调整为继续填补整个垂直空间。可以这样做,如果是这样,怎么办?

我发现了什么:

我已经创建了一个表单。我把它染成了红色。我添加了一个FlowLayout,我将其设为绿色并设置Dock以填充表单。这似乎有效(表格现在都是绿色,没有红色可见)。

然后我向FlowLayout添加了几个控件(从左到右运行)。如果我将它们停靠在顶部,它会按预期工作。如果我把它们对接到底部,它就像顶部一样;暗示垂直空间并不是真正的整个绿地。除非我给他们一个最小尺寸>否则左边,右边或填充组件都不会出现。 0

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

Screenshot of Form

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中的工作方式不同。

1 个答案:

答案 0 :(得分:1)

以下是使用AnchorStyles.Rightenter image description here

的示例
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);
    }
}