在C#中的父窗体中心显示一个子窗体

我创build一个新的表单,并从父窗体调用如下:

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

我需要在父级的中心显示子窗体。 所以,在子表单加载中我做了以下的操作:`

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

但是,这是抛出错误,因为父窗体为空。 我也尝试设置Parent属性,但没有帮助。 对此有什么意见?

尝试:

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

当然,孩子现在将是一个父窗口的阻塞forms(对话框),如果不需要,那么只需将ShowDialogreplace为Show ..

 loginForm.Show(this); 

你仍然需要指定StartPosition。

“父母”和“所有者”之间似乎存在混淆。 如果您打开一个窗体作为MDI窗体,即embedded另一个窗体内,那么这个窗体就是父窗体。 具有值FormStartPosition.CenterParent的窗体属性StartPosition引用这个。 您可能传递给Show方法的参数是Owner,而不是Parent! 这就是为什么frm.StartPosition = FormStartPosition.CenterParent不能像你所期望的那样工作。

如果将其StartPosition设置为Manual,则放置在表单中的以下代码将相对于其所有者以某个偏移量居中。 小偏移量以平铺方式打开窗体。 如果所有者和拥有的表单具有相同的大小,或者您打开了多个拥有的表单,则这是一个优点。

 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; } } 

假设你的代码在你的父窗体内部运行,那么类似这样的东西可能是你正在寻找的东西:

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

为了logging,还有一个Form.CenterToParent()函数,如果你需要在任何原因创build后居中。

MDIForm表单中启动表单时,您需要使用.CenterScreen而不是.CenterParent

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

父母的设置不工作,除非我使用form.ShowDialog();

当使用form.Show();form.Show(this); 没有工作,直到我用, this.CenterToParent(); 。 我只是把它放在窗体的Load方法中。 一切都很好。

开始位置到父母的中心被设置,并使用阻塞showdialog时工作。

你需要这个:

用this.parentreplace我,但在显示该表单之前,需要设置父项。

  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 

在SubLogin窗体上我将公开一个SetLocation方法,以便您可以从您的父窗体中进行设置:

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

那么,从你的主要forms:

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

在事件胎儿负载

 this.CenterToParent(); 

它适用于所有情况,将Form1换成主窗体。

 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); 

当您尝试访问父项时,父项可能尚未设置。

尝试这个:

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

做一个Windows窗体,然后把它的选项:CenterParent然后使用此代码:

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

如果你必须从childForm中心你的childForm,那么代码将是这样的。 这段代码在childForm.cs中

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

如果你想计算自己的位置,那么首先将StartPosition设置为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); 

这是主/父表单,就像Location.X一样。

StartPosition默认值是FormStartPosition.CenterParent ,因此会在显示后更改孩子的位置。

您可以在子窗体的构造函数中设置StartPosition,以使窗体的所有新实例都集中到它的父级:

 public MyForm() { InitializeComponent(); this.StartPosition = FormStartPosition.CenterParent; } 

当然,你也可以在你的子窗体的Designer属性中设置StartPosition属性。 当您想要将子窗体显示为模式对话框时,只需在ShowDialog方法的参数中设置窗口所有者即可:

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

为什么不使用这个?

 LoginForm.WindowStartupLocation = Windows.WindowStartupLocation.CenterOwner 

(vb.net)