C# 在.Net GroupBox中定位控件

C# 在.Net GroupBox中定位控件,c#,winforms,user-interface,controls,groupbox,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();

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

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
属性不同。我一直在做的是添加一个
,其值如下:

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
应该调整大小

问题

有没有一个很好的方法来对付这种疯狂行为?你是做什么的

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

提前谢谢

我尝试了
Dock
Anchor
,但我做不到 好像是让他们做按钮的 填写
GroupBox
客户区。这个 我想要的效果是每一个 按钮来填充他一半的客户 区域

  • TableLayoutPanel
    添加到
    GroupBox
  • 将其
    Dock
    属性设置为
    Fill
  • 设置其
    RowCount=2
    ColumnCount=1
  • 将每行的
    行样式设置为50%。默认情况下在设计器中完成
  • 将两个按钮添加到
    TableLayoutPanel
  • 将其
    Dock
    属性设置为
    Fill
  • 完成了
    我还建议再给设计师一次机会——这真的很好

    如果仍要使用手动布局代码,请使用
    DisplayRectangle
    属性,而不是
    ClientRectangle
    。我更喜欢
    布局
    事件,而不是
    调整大小

    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);
    }
    
    然而,请注意,其中指出:

    此API支持.NET Framework 基础设施,而不是 可以直接从代码中使用


    我打算建议抛锚停泊。我看不出有什么问题。虽然你不喜欢他们,但他们在那里,所以你可以做你想做的事情。您可以单击浏览,也可以尝试用代码将其拆分。我更喜欢点击。你不喜欢
    锚定
    的哪些方面?是因为你不用设计师吗?我不用设计师。我通常不喜欢所见即所得,因为尽管在简单的情况下它可能非常有效,但复杂的情况往往会变得指数级复杂。要对布局进行精细控制,手动布局是一种方式,到目前为止,对我来说,键入布局代码可能比使用设计器快得多,更不用说修改布局代码了!!我修改了问题,允许
    Dock
    Anchor
    回答。我真的无法忍受使用鼠标:没有办法加快速度!此外,使用营利性IDE让我大错特错:)也许如果设计者允许一组丰富的键盘命令。。。