从另一个子窗口显示一个新的子窗口,但将其居中在父窗口上

时间:2011-10-20 18:35:10

标签: winforms position center showdialog

我有一个带有主要表单(fMain)和两个子表单(fLogin和fAdmin)的winforms应用程序。 fLogin使用此代码显示,该代码位于主窗体上按钮的按钮单击事件处理程序中:

// show login form; pass the main form in as an argument
fLogin formLogin = new fLogin(this);
formLogin.StartPosition = FormStartPosition.CenterParent;
formLogin.ShowDialog(this);

在fLogin的构造函数中,我将主窗体分配给私有成员级变量。

// fLogin
fMain _mainForm;

// fLogin constructor
public fLogin(fMain mainForm)
{
    InitializeComponent();
    _mainForm = mainForm;
}

正如您可能想象的那样,fLogin是一个小型表单,其中包含用于用户名和密码以及几个按钮的文本框。当我的用户输入他们的凭据并单击确定按钮时,fLogin将使用服务器验证信息,如果信息良好,fLogin将消失并显示fAdmin。目前,我正在显示fAdmin:

// hide formLogin right away
this.Hide()

// show admin form
fAdmin formAdmin = new fAdmin();
formAdmin.StartPosition = FormStartPosition.CenterParent;
formAdmin.Show(_mainForm); // pass main form as owner of admin form

// close formLogin
this.Close();

我无法设置formAdmin.Parent = _mainForm并让对话框神奇地居中。所以我将_mainForm传递给formAdmin.Show()作为formAdmin的所有者,但这对于使formAdmin居中而言似乎没有帮助。有没有一种简单的方法可以使formAdmin显示在主窗体的中心?

1 个答案:

答案 0 :(得分:1)

我认为您需要重新构建一下这样做,而不是从fLogin中显示fAdmin,关闭fLogin然后从fMain打开fAdmin。如果这不起作用,您可以通过计算fAdmin左上角的点来手动居中,并将此点设置为fAdmin的位置。我遇到过类似的问题,过去我必须这样做。要计算fAdmin的左上角以使其以fMain为中心,请使用以下命令:

Point p = new Point(0, 0);
p.Y = (fMain.Height / 2) - (fAdmin.Height / 2);
p.X = (fMain.Width / 2) - (fAdmin.Width / 2);
fAdmin.Location = p;