.Net GroupBox 中的定位控件

Lim*_*ent 0 c# user-interface controls groupbox winforms

通常,我使用以下方法编写可(优雅地)调整大小的表单。

using System.Drawing;
using System.Windows.Forms;
namespace silly
{
    public class Form1 : Form
    {
        private GroupBox g;
        private Button b1, b2;
        public Form1()
        {
            Init();
        }
        private void Init()
        {
            //create and add controls.
            this.Controls.Add(g = new GroupBox());
            g.Controls.AddRange(new Control[] { 
                    b1 = new Button(),
                    b2 = new Button()});


            g.Text = "group";
            b1.Text = "b1";
            b2.Text = "b2!";


            b1.AutoSize = b2.AutoSize = true;


            g.Resize += new System.EventHandler(g_Resize);

        }

        private void g_Resize(object sender, System.EventArgs e)
        {
            b1.Size = b2.Size = new Size(g.ClientSize.Width, g.ClientSize.Height/2);
            b1.Location = Point.Empty;
            b2.Location = new Point(b1.Left, b1.Bottom);
        }
        protected override void OnResize(System.EventArgs e)
        {
            g.Size = this.ClientSize;
            g.Location = Point.Empty;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,您很快就会注意到,该g.ClientSize属性的工作方式与该属性不同Form.ClientSize。我一直在做的是添加 aPoint和值:

private readonly static Point grp_zero = new Point(10, 20);
Run Code Online (Sandbox Code Playgroud)

帮助正确放置组件。使用这个值,我可以用g_Resize以下方法重构该方法:

b1.Size = b2.Size = new Size(g.ClientSize.Width - grp_zero.X * 2, 
    g.ClientSize.Height/2 - grp_zero.X - grp_zero.Y);
b1.Location = grp_zero;
b2.Location = new Point(b1.Left, b1.Bottom);
Run Code Online (Sandbox Code Playgroud)

并取得了相当好的结果。但是,如果在 的末尾Init();,发现如下代码:

            g.Font = new Font(g.Font.FontFamily, 28);
Run Code Online (Sandbox Code Playgroud)

或类似的东西,grp_zero值得调整大小。

问题

有没有好的解决方法来应对这种疯狂行为?你做什么工作?

我尝试过DockAnchor,但我似乎无法让他们让按钮填满GroupBox客户区。我在这里追求的效果是每个按钮都填满他的一半客户区域。

提前致谢。

Rei*_*ica 5

我尝试过DockAnchor,但我似乎无法让他们让按钮填满GroupBox客户区。我在这里追求的效果是每个按钮都填满他的一半客户区域。

  1. 添加一个TableLayoutPanelGroupBox
    1. 将其Dock属性设置为Fill
    2. 设置其RowCount = 2ColumnCount = 1
    3. RowStyles每行的填充设置为 50%。默认情况下在设计器中完成。
  2. 将您的两个按钮添加到TableLayoutPanel
    1. 将它们的Dock属性设置为Fill
  3. 完毕!

我也建议再给设计师一次机会——真的非常好!