1

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

我需要一次在我的表单上拥有可变数量的用户控件,该数量在运行时是已知的。

我希望每一个都是完整的客户端宽度,并且所有控件都填充窗口,大小相等......例如。如果有两个,那么每个都是客户端高度的一半 - 如果是三个,那么每个都是客户端高度的三分之一。

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

我尝试使用 TableLayoutPanel 来执行此操作,但是当我将 GrowStyle 属性设置为 TableLayoutPanelGrowStyle.AddRows 并添加我的控件时,行数不会改变。

这个布局方案肯定不难实现吧?我好像想不通?

谢谢

4

3 回答 3

3

如果布局很容易计算,那么让 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);
    }
于 2013-04-30T19:23:34.737 回答
0

是的,您可以使用表格布局面板。因为每一行的高度和宽度应该是等于所有行的百分比。那么它将起作用。

于 2013-04-30T16:16:01.297 回答
0

这是一个使用按钮填充配置有 1 个单元格和 Row.SizeType = Percentage 的 TableLayoutPanel 的每个单元格的小示例:

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;
  }
}

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

于 2013-04-30T16:28:19.397 回答