在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(对话框),如果不需要,那么只需将ShowDialog
replace为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)