2009-05-18 22 views
7

Tôi làm cách nào để thiết lập các điều khiển cho trường hợp sau ?:C#/winforms: Làm cách nào để hai điều khiển tự động chia sẻ không gian có sẵn?

Tôi có vùng chứa dành cho cha mẹ, ví dụ: GroupBox.

Bên trong vùng chứa chính này, tôi có hai điều khiển tương tự, ví dụ như ListBox es, cạnh nhau. Cả hai đều có cùng kích thước, vì vậy đường viền giữa hai trong số đó chính xác ở giữa GroupBox.

Bây giờ khi số GroupBox được đổi kích thước, tôi muốn số ListBox cũng được đổi kích thước, nhưng cả hai phải luôn có cùng kích thước so với kích thước khác. Vì vậy, cũng là biên giới giữa hai người trong số họ vẫn ở giữa GroupBox.

Vì vậy, làm cách nào để tôi thiết lập thuộc tính cho ba điều khiển này để đạt được các hành vi mong muốn của mình?

Trả lời

13

Bạn cần một vùng chứa khác. TableLayoutPanel là giải pháp tốt nhất. Sử dụng 1 hàng và 2 cột và dock (Dock = Fill) nó trong hộp nhóm. Chiều rộng của cả hai cột phải được đặt thành 50%. Tiếp theo, bạn có thể thêm các điều khiển của mình vào các ô riêng lẻ và gắn chúng vào (Dock = Fill)

+0

+1 Bạn không * cần * một vùng chứa khác, tuy nhiên phương pháp bảng sẽ thực hiện công việc với mã ít hơn so với không có vùng chứa khác. –

3

Có lẽ một SplitContainer với hai nửa thiết lập đồng đều và IsSplitterFixed thiết lập để true (để ngăn chặn người sử dụng di chuyển nó):

[STAThread] 
static void Main() { 
    Application.EnableVisualStyles(); 
    Application.Run(new Form { 
     Controls = { new SplitContainer { 
      Width = 200, 
      IsSplitterFixed = true, 
      SplitterDistance = 100, 
      SplitterWidth = 1, 
      Dock = DockStyle.Fill, 
      Panel1 = { Controls = { 
        new ListBox { 
         IntegralHeight = false, 
         Dock = DockStyle.Fill, 
         BackColor = Color.Blue, 
         Items = {"abc","def","ghi"} 
        } 
       } 
      }, Panel2 = { Controls = { 
        new ListBox { 
         Dock = DockStyle.Fill, 
         BackColor = Color.Red, 
         IntegralHeight = false, 
         Items = {"jkl","mno","pqr"} 
        } 
       } 
      } 
     }} 
    });   
} 
+0

cảm ơn! có, đó có thể là một lựa chọn. nhưng nó cũng có thể có mà không có một container bổ sung? – clamp

1

Cũng có thể nếu không có sự splitcontainer.

Trong sự kiện thay đổi kích cỡ của hộp nhóm, đặt vị trí của điều khiển đầu tiên thành {0,0} và thứ hai thành {GroupBox.Width/2.0} và đặt kích thước của cả hai thành {GroupBox.Width/2, GroupBox.Height}

Bạn cũng nên để khoảng trống xung quanh các điều khiển để chúng không chồng chéo với đường viền của GroupBox.

private void groupBox1_Resize(object sender, EventArgs e) 
{ 
    groupBox1.SuspendLayout(); 

    listBox1.Location = new Point(7, 20); 
    listBox2.Location = new Point(groupBox1.Width/2, 20); 

    listBox1.Size = new Size(groupBox1.Width/2 - 6, groupBox1.Height - 27); 
    listBox2.Size = new Size((groupBox1.Width + 1)/2 - 6, groupBox1.Height - 27); 

    groupBox1.ResumeLayout(); 
} 
+1

Bạn có thể muốn đặt chiều rộng của hộp thứ hai thành (GroupBox.Width + 1)/2. Điều này làm cho hộp rộng hơn một pixel khi chiều rộng bên trong hộp nhóm là lẻ, nhưng tránh tác dụng "nhảy" giữa hộp nhóm và đường viền hộp danh sách khi thay đổi kích thước. – peterchen

+0

Điểm tốt, đã cập nhật câu trả lời của tôi –

Các vấn đề liên quan