2011-12-19 21 views
21

Tôi có một hình thức con không phương thức mở ra từ một hình thức cha mẹ. Tôi cần căn giữa biểu mẫu con với hình thức cha mẹ của nó. Tôi đã đặt thuộc tính của biểu mẫu con thành CenterParent và đã thử điều này:Cách CenterParent một hình thức phi phương thức

Form2 f = new Form2(); 
f.Show(this); 

nhưng vô ích. Điều này làm việc với hình thức phương thức, nhưng không phải như vậy với các hình thức phi phương thức. Bất kỳ giải pháp đơn giản, hoặc cần tôi đi qua tất cả các tính toán toán học để sửa chữa vị trí của nó để trung tâm?

+1

bạn đã thử đặt thuộc tính 'StartPosition' chưa? –

+0

Tôi đã thử, tôi đã đề cập trong câu hỏi quá .. Nó không hoạt động thực sự với winforms cho một hộp thoại không phương thức .. Dunno tại sao nó như vậy .. – nawfal

+0

khi nào bạn thiết lập tài sản? –

Trả lời

51

Tôi sợ StartPosition.CenterParent chỉ tốt cho các hộp thoại phương thức (.ShowDialog).
Bạn sẽ phải thiết lập các vị trí bằng tay như vậy:

Form f2 = new Form(); 
f2.StartPosition = FormStartPosition.Manual; 
f2.Location = new Point(this.Location.X + (this.Width - f2.Width)/2, this.Location.Y + (this.Height - f2.Height)/2); 
f2.Show(this); 
+0

+1 cho câu trả lời nhanh của bạn như thế này, nhưng tôi đã có những gì tôi muốn trong một thời trang đơn giản trên .. – nawfal

+1

+1 Cái này hoạt động, cái kia không, ít nhất là cho tôi. – kol

+1

Vì câu trả lời khác không làm việc cho tôi nữa, tôi sẽ đánh dấu câu trả lời này là câu trả lời – nawfal

3
Form2 f = new Form2(); 
f.StartPosition = FormStartPosition.CenterParent; 
f.Show(this); 
+0

bạn có biết tại sao nó chỉ hoạt động theo cách này ? và không phải khi thiết lập thuộc tính centerParent từ constructor của form con? – nawfal

+0

không có ý kiến, xin lỗi. –

+5

Lạ ... Điều này ** không hoạt động ** đối với tôi ... – kol

9

Có vẻ như thực sự kỳ lạ mà Show (này) không hành xử theo cách tương tự như ShowDialog (this) w.r.t hình thức định tâm. Tất cả những gì tôi cung cấp là giải pháp của Rotem một cách gọn gàng để che giấu cách giải quyết.

Tạo một lớp mở rộng:

public static class Extension 
{ 
    public static Form CenterForm(this Form child, Form parent) 
    { 
     child.StartPosition = FormStartPosition.Manual; 
     child.Location = new Point(parent.Location.X + (parent.Width - child.Width)/2, parent.Location.Y + (parent.Height - child.Height)/2); 
     return child; 
    } 
} 

Gọi nó với fuss tối thiểu:

var form = new Form(); 
form.CenterForm(this).Show(); 
3

Đối với hình thức modeless, đây là giải pháp.

Nếu bạn muốn hiển thị hộp thoại không có điều kiện ở giữa biểu mẫu gốc thì bạn cần đặt biểu mẫu của trẻ là StartPosition thành FormStartPosition.Manual.

form.StartPosition = FormStartPosition.Manual; 

form.Location = new Point(parent.Location.X + (parent.Width - form.Width)/2, parent.Location.Y + (parent.Height - form.Height)/2); 

form.Show(parent); 

Trong .NET Framework 4.0 - Nếu bạn đặt thuộc tính ControlBox của hình thức trẻ falseFormBorderStyle tài sản để NotSizable như dưới đây:

form.ControlBox = false; 
form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 

sau đó bạn sẽ đối mặt với những vấn đề mà một phần của hình thức con doesn Không hiển thị, nếu StartPosition được đặt thành FormStartPosition.Manual.

Để giải quyết vấn đề này, bạn cần đặt thuộc tính của trẻ là Localizable thành true.

+1

Cảm ơn bạn rất nhiều. Ý kiến ​​của bạn về một thuộc tính Localizable của biểu mẫu đã khắc phục được sự cố đã làm tôi phiền lòng về tuổi tác, nơi mà trên một số hệ thống của khách hàng, các biểu mẫu bật lên của tôi sẽ hơi quá nhỏ. Nó không phải là tài liệu rất tốt của Microsoft. Bạn có hiểu tại sao nó hoạt động và những gì đang xảy ra khi Localizable là sai? hoặc biết bất kỳ liên kết tốt nào giải thích nó? Cảm ơn một lần nữa. – Erik

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