Windows窗体动态布局(WIndows Forms dynamic layout)

2019-10-18 02:03发布

我有一个自定义用户控件这确实我的应用程序的工作。

我需要有一个可变数目我的usercontrols我的表上一次,这个数字在运行时是已知的。

我想每一个是完整的客户端宽度和所有控件,以填补窗口,大小相等...如。 如果有两个,那么每个都是半客户高度 - 如果有三个,那么每一个是客户高度的三分之一。

和布局应该调整为主要调整窗口大小。 我不希望用户能够通过调整主窗口来调整控制以外(所以分割容器出来)

我试图使用TableLayoutPanel中要做到这一点,但是当我设置GrowStyle属性TableLayoutPanelGrowStyle.AddRows,并加入我的控制,行的数量不会改变。

当然这种布局方案是不难实现的呢? 我似乎无法弄清楚?

谢谢

Answer 1:

它的布局是简单的计算,然后它会是相当困难的,使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);
    }


Answer 2:

是的,你可以使用Table布局面板。 在每一行的高度和宽度应在百分比等于所有行。 然后它会工作。



Answer 3:

下面是一个使用按钮来填充配置有1个小区和Row.SizeType =百分比的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;
  }
}

你添加一个按钮(或用户控件)每次重新计算各列的百分比高度。



文章来源: WIndows Forms dynamic layout