【问题标题】:Set the Parent of a Form设置表单的父级
【发布时间】:2010-02-07 18:17:33
【问题描述】:

我有一个 Windows 窗体,我想从中打开一个显示“正在保存...”的状态窗体 然后在保存完成后消失。我想把这个小的状态表格放在呼叫表格的中间。我尝试将“StartPosition”属性设置为“CenterParent”,但它不起作用。我从其他表单创建状态表单,如下所示:

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

调用表单不是“父级”吗? 当我设置一个保存手表时,它说它没有父母。

我试过了:

SavingForm saving = new SavingForm();
saving.Parent = this;
savingForm.Show();
Thread.Sleep(500);
savingForm.Close();

它会抛出异常“无法将顶级控件添加到控件中。”

如何让这个状态窗口在呼叫窗口居中?

提前致谢

【问题讨论】:

  • The Show.. Sleep.. Close.. 代码不保证实际显示任何内容。此外,您的 UI 线程在睡眠期间挂起,因此可能会引入 UI 故障。
  • 非常有用的相关帖子,这是这个问题的根源 - Whats the difference between Parentform and Owner

标签: c# winforms


【解决方案1】:

我会这样做:

SavingForm saving = new SavingForm();
savingForm.ShowDialog(this);

在 SavingForm 中,我将在负载处理程序中启动一个计时器,该计时器运行 500 毫秒,然后在完成后关闭表单。这样更干净。 ShowDialog 还会锁定你的 UI,只显示保存表单,不允许用户胡乱做任何事情。

【讨论】:

【解决方案2】:

使用这个:

saving.Show(this);

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

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

saving.ShowDialog(this);

【讨论】:

  • 这设置了“所有者”而不是“父”,它们是不同的选项。
  • 没错。例如,当您将 Form2 停靠在 Form1 中并打开 Form3 时,所有者将是 Form1 而不是 Form2!
【解决方案3】:

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

SavingForm saving = new SavingForm() { Owner = this };

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

您可以很好地解释 Owner、Parent 和 ParentForm here 之间的区别。

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

【讨论】:

    猜你喜欢
    • 2011-10-03
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 2021-05-12
    • 2011-10-08
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多