【问题标题】:WIndows Forms dynamic layoutWINDOWS 窗体动态布局
【发布时间】:2013-05-01 03:23:34
【问题描述】:

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

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

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

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

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

这个布局方案肯定不难实现吧?看不懂?

谢谢

【问题讨论】:

    标签: winforms layout tablelayoutpanel


    【解决方案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);
        }
    

    【讨论】:

    • 自发布问题以来,我得出了类似的结论。我的布局并不复杂,自定义代码也不难。不过我很惊讶,真的,因为虽然我以前从来没有使用过 TableLayoutPanel 的理由,但我的印象是,这种事情正是它做得很好 - 但似乎并非如此。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这是一个使用按钮填充配置有 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;
        }
      }
      

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

      【讨论】:

      • 感谢您的示例。我会想出类似的东西,但我对它并不满意——它看起来并不比实现手动布局代码更简单。
      猜你喜欢
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      相关资源
      最近更新 更多