在.Net GroupBox中定位控件

时间:2011-02-11 15:42:17

标签: c# winforms user-interface controls groupbox

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

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

但是,您很快就会注意到g.ClientSize属性不像Form.ClientSize属性那样工作。我一直在做的是添加Point值:

private readonly static Point grp_zero = new Point(10, 20);

帮助正确放置组件。使用此值,我可以使用:

重构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);

结果相当不错。但是,如果在Init();的末尾,则会找到以下代码:

            g.Font = new Font(g.Font.FontFamily, 28);

或类似名称,grp_zero值得调整大小。

问题

对这种疯狂有没有好的解决方法?你做什么的?

我尝试了DockAnchor,但我似乎无法让它们使按钮填满GroupBox客户区。我在这之后的效果是每个按钮填充他的一半客户区。

提前致谢。

2 个答案:

答案 0 :(得分:4)

  

我尝试了DockAnchor,但我做不到   似乎让他们制作按钮   填写GroupBox客户区。该   效果我在这之后就是每个人   按钮填充他的一半客户端   区域。

  1. TableLayoutPanel添加GroupBox
    1. 将其Dock属性设置为Fill
    2. 设置其RowCount = 2ColumnCount = 1
    3. 为每行设置RowStyles到50%的填充。默认情况下在设计器中完成。
  2. 将两个按钮添加到TableLayoutPanel
    1. Dock属性设置为Fill
  3. 完成!
  4. 我还建议给设计师另一个机会 - 它真的非常好!

答案 1 :(得分:3)

如果您仍想使用手动布局代码,请使用DisplayRectangle属性而不是ClientRectangle。我更喜欢Layout事件而不是Resize

private void g_Layout(object sender, System.LayoutEventArgs e)
{
    b1.Size = b2.Size = new Size(g.DisplayRectangle.Width, 
                                 g.DisplayRectangle.Height/2 - 1);

    b1.Location = new Point(g.DisplayRectangle.Left, 
                            g.DisplayRectangle.Top);

    b2.Location = new Point(g.DisplayRectangle.Left, 
                           g.DisplayRectangle.Top + g.DisplayRectangle.Height/2);
}

但请注意,the documentation表示:

  

此API支持.NET Framework   基础设施并不打算   直接在您的代码中使用。