2011-02-11 27 views
0

通常,我使用下面的方法編寫可調整大小(優雅地)的表單。.Net 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客戶區。我在此之後的效果是每個按鈕都填滿了他的一半客戶區域。

在此先感謝。

+1

我打算建議錨和碼頭。我看不出它有什麼問題。 – sloth 2011-02-11 15:45:10

+1

儘管你不喜歡他們,他們在那裏,所以你可以做你想做的事情。你可以點擊你的方式,也可以嘗試用代碼分開。我更喜歡點擊。 – 2011-02-11 15:48:51

回答

4

我試圖DockAnchor,但我似乎無法 讓他們使按鈕 填補GroupBox客戶區。 效果我在這裏之後是爲每個 按鈕填補他的一半客戶端 區域。

  1. 添加TableLayoutPanelGroupBox
    1. 設置其Dock屬性Fill
    2. 設置其RowCount = 2ColumnCount = 1
    3. RowStyles至50%的填充每一行。在設計器中默認完成。
  2. TableLayoutPanel
    1. 設置其屬性Dock添加您的兩個按鈕來Fill
  3. 完成!

我還建議給設計師另一個機會 - 它確實非常好!

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 基礎結構,不打算 從代碼中直接使用。