Hiển thị biểu mẫu con ở trung tâm Biểu mẫu gốc trong C #


76

Tôi tạo một biểu mẫu mới và gọi từ biểu mẫu mẹ như sau:

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

Tôi cần hiển thị biểu mẫu con ở trung tâm của phụ huynh. Vì vậy, trong tải biểu mẫu con, tôi thực hiện như 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 ném ra vì biểu mẫu mẹ là null. Tôi cũng đã thử đặt thuộc tính Parent nhưng không giúp được gì. Bất kỳ đầu vào này?

Câu trả lời:


134

Thử:

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

Tất nhiên con cho bây giờ sẽ là một biểu mẫu chặn (hộp thoại) của cửa sổ mẹ, nếu điều đó không được mong muốn thì chỉ cần thay thế ShowDialogbằng Show..

loginForm.Show(this);

Tuy nhiên, bạn vẫn cần chỉ định StartPosition.


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

53
loginForm.StartPosition = FormStartPosition.CenterParent cộng với loginForm.Show (this); không căn giữa biểu mẫu.
Pedro77,

@ Pedro77 Tôi cũng gặp trường hợp tương tự ngoại trừ việc tôi đã thực hiện xong hộp thoại hiển thị từ một luồng khác nên nó sẽ không cho phép tôi chuyển "cái này" cho showDialog. bất kỳ đề nghị ở đây ??
Anil

1
@Anil Tôi nghĩ bạn không nên tạo các vòng lặp giao diện người dùng từ một chuỗi khác. Bạn nên sử dụng begininvoke gọi cho tác vụ đó. Hãy xem các lệnh đó.
Pedro77

20

Cài đặt của phụ huynh không hoạt động đối với 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ó gì hoạt động cho đến khi tôi sử dụng , this.CenterToParent();. Tôi chỉ đặt nó trong Tải phương thức của biểu mẫu. Mọi thứ đều tốt.

Vị trí bắt đầu đến trung tâm của phụ huynh đã được đặt và hoạt động khi sử dụng showdialog chặn.


18

Dường 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 MDI-form, nghĩa là được nhúng bên trong một biểu mẫu khác, thì biểu mẫu xung quanh này là Mẫu chính. Thuộc tính biểu mẫu StartPosition với giá trị FormStartPosition.CenterParent đề cập đến thuộc tính này. Tham số bạn có thể truyền cho phương thức Show là Chủ sở hữu, không phải là Cấp độ gốc! Đâ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 nó đối với chủ sở hữu của nó với một số bù trừ, nếu StartPosition của nó được đặt thành Thủ công. Phần bù nhỏ sẽ mở ra các biểu mẫu theo cách lát gạch. Đây là một lợi thế nếu chủ sở hữu và biểu mẫu được sở hữu có cùng kích thước hoặc nếu bạn mở nhiều 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;
    }
}

Tôi khá chắc chắn rằng điều đó CenterParentcũng hoạt động tương đối Owner, ít nhất là với phiên bản .net mà tôi đang sử dụng.
binki

12

Giả sử mã của bạn đang chạy bên trong biểu mẫu mẹ của bạn, thì một cái gì đó như thế này có thể là thứ bạn đang tìm kiếm:

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

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


9

Khi khởi chạy biểu mẫu bên trong MDIFormbiểu mẫu, bạn sẽ cần sử dụng .CenterScreenthay thế .CenterParent.

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


4

Bạn cần cái này:

Thay thế Tôi bằng this.parent, nhưng bạn cần đặt cha mẹ trước khi hiển thị biểu mẫu đó.

  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

3

Nó hoạt động trong mọi trường hợp, hãy hoán đổi Form1 cho biểu mẫu 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);

2

Trên SubLogin Form, tôi sẽ hiển thị một phương thức SetLocation để bạn có thể đặt nó từ biểu mẫu mẹ của mình:

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

Sau đó, từ biểu mẫu chính của bạn:

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

2

Nếu bạn muốn tính toán vị trí của riêng mình, thì trước tiên hãy đặt StartPositionthành 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);

Trong đó đây là biểu mẫu chính / phụ huynh, giống như Location.X.

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


2

Khi bạn muốn sử dụng cửa sổ không chặn (show () thay vì showDialog ()), điều này không hoạt động:

//not work with .Show(this) but only with .ShowDialog(this)
loginForm.StartPosition = FormStartPosition.CenterParent;
loginForm.Show(this);

Trong trường hợp này, bạn có thể sử dụng mã này để căn giữa biểu mẫu con trước khi hiển thị biểu mẫu:

//this = the parent
frmDownloadPercent frm = new frmDownloadPercent();
frm.Show(this); //this = the parent form
//here the tips
frm.Top = this.Top + ((this.Height / 2) - (frm.Height / 2));
frm.Left = this.Left + ((this.Width / 2) - (frm.Width / 2));

Đây nên là câu trả lời được chọn !!! +1
Si8

0

Tạo Biểu mẫu Windows, sau đó đặt tùy chọn cho nó: CenterParent rồi sử dụng Mã này:

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

0

Bạn có thể đặt StartPosition trong phương thức khởi tạo của biểu mẫu con để tất cả các phiên bản mới của biểu mẫu được tập trung vào cha của nó:

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 Designer cho biểu mẫu con của bạn. Khi bạn muốn hiển thị biểu mẫu con dưới dạng hộp thoại phương thức, 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);
}

0

Nếu bất kỳ biểu mẫu cửa sổ nào (biểu mẫu con) được mở từ một luồng mới của cửa sổ Chính (biểu mẫu mẹ) thì không thể giữ cửa sổ phụ ở giữa cửa sổ chính do đó chúng ta cần sửa vị trí của cửa sổ phụ theo cách thủ công bằng cách nghĩa của X và Y đồng quy.

Trong thuộc tính của Subwindow, thay đổi "StartPosition" thành "Manual"

mã trong cửa sổ chính

private void SomeFunction()
{
    Thread m_Thread = new Thread(LoadingUIForm);
    m_Thread.Start();
    OtherParallelFunction();
    m_Thread.Abort();
}

private void LoadingUIForm()
{
    m_LoadingWindow = new LoadingForm(this);
    m_LoadingWindow.ShowDialog();
}

mã trong subwindow để xác định vị trí của chính nó thông qua vị trí hiện tại chính cũng như kích thước

public LoadingForm(Control m_Parent)
{
   InitializeComponent();
   this.Location = new Point( m_Parent.Location.X+(m_Parent.Size.Width/2)-(this.Size.Width/2),
                              m_Parent.Location.Y+(m_Parent.Size.Height/2)-(this.Size.Height/2)
                            );
}

Ở đây tọa độ của trung tâm mẹ được tính toán cũng như hướng dẫn con được giữ chính xác ở trung tâm của phụ huynh bằng cách tính toán trung tâm của chính nó bằng (this.height / 2) và (this.width / 2) hàm này có thể cũng được thực hiện cho các sự kiện di dời của cha mẹ.


0

Là một biểu mẫu con, tôi nghĩ nó sẽ không Bắt đầu ở giữa biểu mẫu mẹ cho đến khi bạn Hiển thị nó dưới dạng Hộp thoại. .......... Form2.ShowDialog();

tôi đã chuẩn bị đưa ra Giới thiệu về Biểu mẫu. và điều này là hoàn hảo mà tôi đang tìm kiếm. và cho đến khi bạn đóng Biểu mẫu Giới thiệu, bạn không thể Chạm / nhấp vào bất kỳ thứ gì của cha mẹ Biểu mẫu khi bạn Nhấp vào Biểu mẫu Giới thiệu (trong trường hợp của tôi) .oz của nó Hiển thị dưới dạng Hộp thoại


-1

Cấp độ gốc có thể chưa được đặt khi bạn cố gắng truy cập vào nó.

Thử cái này:

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

3
CenterToParent không phải là một phương thức công khai. Bạn cần ủy quyền phương thức này như một phương thức công khai khỏi sự kiểm soát của bạn.
Jarek

-1

Nếu bạn phải căn giữa childForm của bạn, từ childForm thì mã sẽ 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();

-1
    protected override void OnLoad(EventArgs e) {
        base.OnLoad(e);

        CenterToParent();
    }

-4

Tại sao không sử dụng cái này?

LoginForm.WindowStartupLocation = Windows.WindowStartupLocation.CenterOwner 

(vb.net)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.