2009-06-03 33 views
56

tôi tạo ra một hình thức mới và gọi từ form cha như sau:Hiển thị một hình thức trẻ ở trung tâm của hình thức phụ huynh trong C#

loginForm = new SubLogin(); 
loginForm.Show(); 

tôi cần phải hiển thị dưới dạng con ở trung tâm của cha mẹ. Vì vậy, trong tải biểu mẫu con tôi làm theo các bước sau: `

Point p = new Point(this.ParentForm.Width/2 - this.Width/2, this.ParentForm.Height/2 - this.Height/2); 
this.Location = p; 

Nhưng đây là lỗi khi gửi biểu mẫu gốc là rỗng. Tôi đã thử đặt thuộc tính Gốc là tốt, nhưng không giúp được gì. Bất kỳ đầu vào về điều này?

+0

Bạn gặp phải lỗi gì? – Joseph

Trả lời

113

Hãy thử:

loginForm.StartPosition = FormStartPosition.CenterParent; 
loginForm.ShowDialog(this); 

Dĩ nhiên đứa trẻ bây giờ sẽ là một hình thức chặn (thoại) của cửa sổ cha mẹ, nếu đó không phải mong muốn sau đó chỉ cần thay thế ShowDialog với Show ..

loginForm.Show(this); 

Bạn vẫn cần chỉ định StartPosition.

+12

Bạn cũng có thể đặt thuộc tính của LoginForm trong trình thiết kế. –

+37

loginForm.StartPosition = FormStartPosition.CenterParent plus loginForm.Show (this); không tập trung vào biểu mẫu. – Pedro77

2

Trên Form SubLogin tôi sẽ phơi bày một phương pháp setLocation để bạn có thể thiết lập nó từ hình thức cha mẹ của bạn:

public class SubLogin : Form 
{ 
    public void SetLocation(Point p) 
    { 
     this.Location = p; 
    } 
} 

Sau đó, từ hình thức chính của bạn:

loginForm = new SubLogin(); 
Point p = //do math to get point 
loginForm.SetLocation(p); 
loginForm.Show(); 
11

Giả sử mã của bạn là chạy bên trong hình thức cha mẹ của bạn, sau đó một cái gì đó như thế này có lẽ là những gì bạn đang tìm kiếm:

loginForm = new SubLogin(); 
loginForm.StartPosition = FormStartPosition.CenterParent 
loginForm.Show(this); 

Để ghi lại, cũng có chức năng Form.CenterToParent(), nếu bạn cần căn giữa nó sau khi tạo vì bất kỳ lý do nào.

0

Cha mẹ có thể chưa được đặt khi bạn đang cố truy cập.

Hãy thử điều này:

loginForm = new SubLogin(); 
loginForm.Show(this); 
loginForm.CenterToParent() 
+2

CenterToParent không phải là phương pháp công khai. Bạn cần ủy quyền phương thức này làm phương thức công khai từ kiểm soát của bạn. – Jarek

4

Bạn cần điều này:

Thay nhớ với this.parent, nhưng bạn cần phải đặt phụ huynh trước khi bạn thấy hình thức đó.

Private Sub ÜberToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ÜberToolStripMenuItem.Click 

     'About.StartPosition = FormStartPosition.Manual ' !!!!! 
     About.Location = New Point(Me.Location.X + Me.Width/2 - About.Width/2, Me.Location.Y + Me.Height/2 - About.Height/2) 
     About.Show() 
    End Sub 
13

Có vẻ như có sự nhầm lẫn giữa "Cha mẹ" và "Chủ sở hữu". Nếu bạn mở một biểu mẫu dưới dạng biểu mẫu MDI, tức là được nhúng vào bên trong một biểu mẫu khác, thì biểu mẫu xung quanh này là Phụ huynh. Thuộc tính biểu mẫu StartPosition với giá trị FormStartPosition.CenterParent đề cập đến cái này. Thông số bạn có thể chuyển sang phương thức Hiển thị là Chủ sở hữu, không phải là Phụ huynh! Đây là lý do tại sao frm.StartPosition = FormStartPosition.CenterParent không hoạt động như bạn mong đợi.

Mã sau được đặt trong biểu mẫu sẽ căn giữa mã đó với chủ sở hữu của nó với một số bù trừ, nếu vị trí đặt của nó được đặt thành Thủ công. Các bù đắp nhỏ sẽ mở ra các hình thức một cách lát gạch. Đây là một lợi thế nếu chủ sở hữu và biểu mẫu sở hữu có cùng kích thước hoặc nếu bạn mở một số biểu mẫu được sở hữu.

protected override void OnShown(EventArgs e) 
{ 
    base.OnShown(e); 
    if (Owner != null && StartPosition == FormStartPosition.Manual) { 
     int offset = Owner.OwnedForms.Length * 38; // approx. 10mm 
     Point p = new Point(Owner.Left + Owner.Width/2 - Width/2 + offset, Owner.Top + Owner.Height/2 - Height/2 + offset); 
     this.Location = p; 
    } 
} 
+0

Tôi khá chắc chắn rằng 'CenterParent' cũng hoạt động tương đối so với' Chủ sở hữu', ít nhất là với phiên bản .net mà tôi đang sử dụng. – binki

7

Khi tung ra một hình thức bên trong một hình thức MDIForm bạn sẽ cần phải sử dụng .CenterScreen thay vì .CenterParent.

FrmLogin f = new FrmLogin(); 
f.MdiParent = this; 
f.StartPosition = FormStartPosition.CenterScreen; 
f.Show(); 
-4

Tại sao không sử dụng?

LoginForm.WindowStartupLocation = Windows.WindowStartupLocation.CenterOwner 

(vb.net)

0

Tạo một Windows Form, sau đó đặt tùy chọn cho nó: CenterParent sau đó sử dụng Bộ luật này:

yourChildFormName x = new yourChildFormName(); 
x.ShowDialog(); 
0

Nếu bạn muốn tính toán vị trí của riêng mình, sau đó đầu tiên được đặt StartPosition đến FormStartPosition.Manual:

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

Đây là chính/phụ huynh cho m, giống như Location.X.

Giá trị mặc định cho StartPositionFormStartPosition.CenterParent và do đó thay đổi vị trí của trẻ sau khi hiển thị.

+0

Câu trả lời này phù hợp với tôi. Cảm ơn. –

0

Nếu bạn phải căn giữa con bạnForm, từ childForm thì mã sẽ giống như thế này. Mã này nằm trong childForm.cs

this.Show(parent as Form); // I received the parent object as Object type 
this.CenterToParent(); 
5

Cài đặt của cha mẹ không hoạt động cho tôi trừ khi tôi sử dụng form.ShowDialog();.

Khi sử dụng form.Show(); hoặc form.Show(this); không có tác dụng cho đến khi tôi sử dụng, this.CenterToParent();. Tôi chỉ cần đặt trong phương thức Tải của biểu mẫu. Mọi thứ đều tốt.

Vị trí bắt đầu đến trung tâm của cha mẹ được đặt và hoạt động khi sử dụng chế độ hiển thị chặn.

2
childform = new Child(); 
childform.Show(this); 

Trong tải childform kiện

this.CenterToParent(); 
0

Bạn có thể đặt StartPosition trong constructor của form con sao cho tất cả các trường hợp mới của mẫu được làm trung tâm để nó mẹ:

public MyForm() 
{ 
    InitializeComponent(); 

    this.StartPosition = FormStartPosition.CenterParent; 
} 

Tất nhiên, bạn cũng có thể đặt thuộc tính StartPosition trong thuộc tính thiết kế cho biểu mẫu con của bạn. Khi bạn muốn hiển thị dưới dạng con như một hộp thoại modal, chỉ cần đặt chủ sở hữu cửa sổ trong tham số cho phương thức ShowDialog:

private void buttonShowMyForm_Click(object sender, EventArgs e) 
{ 
    MyForm form = new MyForm(); 
    form.ShowDialog(this); 
} 
2

Nó hoạt động trong mọi trường hợp, trao đổi Form1 cho hình thức chính của bạn.

Popup popup = new Popup(); 
popup.StartPosition = System.Windows.Forms.FormStartPosition.Manual; 
popup.Location = new System.Drawing.Point((Form1.ActiveForm.Location.X + Form1.ActiveForm.Width/2) - (popup.Width/2),(Form1.ActiveForm.Location.Y + Form1.ActiveForm.Height/2) - (popup.Height/2)); 
popup.Show(Form1.ActiveForm); 
Các vấn đề liên quan