设置表单的父级

Gre*_*row 19 c# winforms

我有一个Windows表单,我想打开一个状态表单,上面写着"正在保存...",然后在保存完成时消失.我想将这个小状态表单放在调用表单的中间.我已经尝试将"StartPosition"设置为"CenterParent",但它确实有效.我从另一个表单创建状态表单,如下所示:

SavingForm saving = new SavingForm();
savingForm.Show();
Thread.Sleep(500); //Someone said this is bad practice ... why?
savingForm.Close();
Run Code Online (Sandbox Code Playgroud)

呼叫形式不是"父母"吗?当我设置一个保存手表时说它没有父母.

我试过了:

SavingForm saving = new SavingForm();
saving.Parent = this;
savingForm.Show();
Thread.Sleep(500);
savingForm.Close();
Run Code Online (Sandbox Code Playgroud)

它会引发异常"顶级控件无法添加到控件中".

如何将此状态窗口置于调用窗口中心?

提前致谢

Pau*_*sik 18

我会做这样的事情:

SavingForm saving = new SavingForm();
savingForm.ShowDialog(this);
Run Code Online (Sandbox Code Playgroud)

在SavingForm中,我将在加载处理程序中启动一个运行500毫秒的计时器,然后在完成后关闭表单.这样清洁.ShowDialog还会锁定您的UI以仅显示保存表单,并且不允许用户使用任何内容.


Cor*_*ton 15

用这个:

saving.Show(this);
Run Code Online (Sandbox Code Playgroud)

在显示表单时设置所有者.

编辑:ShowDialog()方法还有一个重载,让您指定所有者,如果这是您决定去的路线:

saving.ShowDialog(this);
Run Code Online (Sandbox Code Playgroud)

  • 这将设置"所有者"而不是"父",它们是不同的选项. (16认同)

Mat*_*att 6

如果将父级 ( this) 传递给所有者,例如

SavingForm saving = new SavingForm() { Owner = this };
Run Code Online (Sandbox Code Playgroud)

那么您可以在子表单中访问 Owner 的属性和方法(在本例中SavingForm),前提是将 Owner 的属性Modifier设置为InternalPublic针对您需要访问的每个属性(您可以直接在源代码中编辑修饰符,或通过表单的设计器属性-Modifier每个控件都有一个属性)。

您可以在这里找到对 Owner、Parent 和 ParentForm 之间差异的很好的解释。

注意:saving.Show(this);像or一样传递它对saving.ShowDialog(this);我的情况没有帮助。