WIndows窗体动态布局



我有一个自定义的usercontrol来完成我的应用程序的工作。

我需要在我的表单上有一个可变数量的用户控件,这个数量是在运行时知道的。

我希望每一个都是完整的客户端宽度,所有的控件来填充窗口,大小相等…如。如果有两个,则每个都是客户端高度的一半;如果有三个,则每个都是客户端高度的三分之一。

布局应该随着主窗口的大小而调整。我不希望用户能够调整控件的大小,而不是通过调整主窗口的大小(因此拆分容器)

我试图使用TableLayoutPanel来做到这一点,但当我设置的GrowStyle属性为TableLayoutPanelGrowStyle。AddRows,并添加我的控件,行数不会改变。

这个布局方案应该不难实现吧?我好像弄不明白?

谢谢

如果布局很容易计算,那么就很难使TLP获得回报。这是一个在设计器中工作得很好的控件,但是当你有不可预测的控件数量时,它就很尴尬了。

这也会很好地工作,更少的代码和一个更少的控件来减慢你的UI:

    protected override void OnResize(EventArgs e) {
        for (int ix = 0; ix < Controls.Count; ++ix) {
            int y1 = this.ClientSize.Height * ix / Controls.Count;
            int y2 = this.ClientSize.Height * (ix + 1) / Controls.Count;
            Controls[ix].Bounds = new Rectangle(0, y1, this.ClientSize.Width, y2-y1);
        }
        base.OnResize(e);
    }
    protected override void OnLoad(EventArgs e) {
        OnResize(e);
        base.OnLoad(e);
    }

是的,你可以使用表格布局面板。在这种情况下,每一行的高度和宽度都应该与所有行相等。

下面是一个小示例,使用按钮填充配置为一个单元格和一行的TableLayoutPanel的每个单元格。size: 0

private int buttonCount = 0;
void button1_Click(object sender, EventArgs e) {
  Button b = new Button() { Text = "Button #" + (++buttonCount).ToString() };
  b.Dock = DockStyle.Fill;
  if (buttonCount == 1) {
    tlp.Controls.Add(b, 0, 0);
  } else {
    tlp.RowStyles.Add(new RowStyle() { SizeType = SizeType.Percent });
    tlp.Controls.Add(b, 0, tlp.RowCount);
    tlp.RowCount++;
  }
  Single percHeight = ((Single)1 / (Single)tlp.RowStyles.Count) * 100;
  foreach (RowStyle rs in tlp.RowStyles) {
    rs.Height = percHeight;
  }
}

每次添加按钮(或用户控件)时,都要重新计算每行的高度百分比

最新更新