我是C#的新手,可能会遗漏一些明显的东西。我发现只有一个相关的问题here,这不是完全匹配,也不是非常权威。
我想要的是让它可以将一个控件停靠在FlowLayout中(从左到右设置),以便它将填充整个垂直空间,当用户调整Form的大小时,控件会调整为继续填补整个垂直空间。可以这样做,如果是这样,怎么办?
我发现了什么:
我已经创建了一个表单。我把它染成了红色。我添加了一个FlowLayout,我将其设为绿色并设置Dock以填充表单。这似乎有效(表格现在都是绿色,没有红色可见)。
然后我向FlowLayout添加了几个控件(从左到右运行)。如果我将它们停靠在顶部,它会按预期工作。如果我把它们对接到底部,它就像顶部一样;暗示垂直空间并不是真正的整个绿地。除非我给他们一个最小尺寸>否则左边,右边或填充组件都不会出现。 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中的工作方式不同。
答案 0 :(得分:1)
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);
}
}