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);
}
}
我是 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);
}
}