在MDI Child

时间:2016-05-12 23:53:07

标签: c# winforms centering mdi

免责声明:我知道已经为类似的问题提供了答案,但这些答案对我来说似乎没有用。

我有一个使用带有MDIClient的主窗体的应用程序;我想显示一个允许用户输入值的对话框;此对话框显示在MDIChild表单的中心,从中调用对话框。

我已经看过以下解决方案:

C# - Show Dialog box at center of its parent

但是,除非我的解决方案存在与应用程序相关的差异,否则这似乎存在一些基本问题。

建议以下内容实现此目的:

private void OpenForm(Form parent)
{
    FormLoading frm = new FormLoading();
    frm.Parent = parent;
    frm.StartPosition = FormStartPosition.CenterParent;
    frm.ShowDialog();
}

然而,这有以下问题:

当我尝试实现这一点时,当单步执行代码时,只要它命中行以设置父表单,就会发生以下异常:

Top-level control cannot be added to a control.

N.B。除非所有表单初始化的TopLevel值为true,否则此值似乎无法在任何位置设置!

好的,所以;我们将TopLevel设置为false,以允许将父窗体设置为对话框的父窗体。假设我这样做,当它到达ShowDialog()的行:

Form that is not a top-level form cannot be displayed as a modal dialog box. Remove the form from any parent form before calling showDialog.

这就是我的泥潭;对话框表格似乎不是一个TopLevel表单,以便拥有一个Parent,但同时需要一个TopLevel表单,以便它可以显示为一个对话框......

最后说明,我认为我不应该设置' StartPosition'我想要的形式作为对话框,因为这已经在表单的InitializeComponent()部分中设置;尽管如此,我已经尝试在函数中明确设置它并没有任何区别。

1 个答案:

答案 0 :(得分:1)

您可以手动定位对话框表单:

    private void invokeDialogButton_Click(object sender, EventArgs e)
    {
        var dialogForm = new DialogForm();
        dialogForm.StartPosition = FormStartPosition.Manual;

        //Get the actual position of the MDI Parent form in screen coords
        Point screenLocation = Parent.PointToScreen(Parent.Location);

        //Adjust for position of the MDI Child form in screen coords
        screenLocation.X += Location.X;
        screenLocation.Y += Location.Y;

        dialogForm.Location = new Point(screenLocation.X + (Width - dialogForm.Width) / 2, 
                                        screenLocation.Y + (Height - dialogForm.Height) / 2);

        dialogForm.ShowDialog(this);
    }

在我的Github页面(Visual Studio 2015社区版项目)上查看此working example project