【问题标题】:Force a form to stay on top强制表单保持在顶部
【发布时间】:2013-03-21 14:42:09
【问题描述】:

我希望表单在每次打开时都显示为模态。因为我不能改变它的创建和打开方式。我想知道是否有可能使表单在表单类中保持在顶部。

一个机会是TopMost 属性。这通常有效,但如果我在主线程等待它关闭时显示表单,即使我更改应用程序(例如更改为浏览器),表单也会保持在顶部。所以无论我在哪里,表格仍然显示。

我遇到的另一个问题是,在某些情况下,它被父表单采用,然后可能会阻止其他窗口或弹出消息。

我正在考虑使用OnLostFocus 事件的挂钩,以便在失去焦点后再次将其置于首位,但我不确定这是否是个好主意...

有什么有用的想法吗?


编辑

由于 cmets,我将扩展我的描述,这是真正的用例

我们正在使用 Devexpress 的 SplashScreenManager,它能够将某种形式显示为 WaitForm。由于WaitForm 不打算显示为模态(see on the Support Center),因此我们正在寻找一种方法来做到这一点。

我们无法更改表单的显示方式,因为这是通过SplashScreenManager 完成的。 WaitForm 既来自主线程,也来自某些后台工作线程。

所以这只是关于我们自己的一种形式,在我们自己的应用程序中显示它。

【问题讨论】:

  • 如果有另一个应用程序采用相同的逻辑怎么办?没用。
  • @LarsTech 我用更多细节更新了我的问题。
  • 您只需进行两次更改即可将任何非模态表单变为模态。首先使它成为一个 owned 窗口,所以它总是在另一个窗口的顶部。 Show(owner) 重载就是这样做的。其次,通过将其 Enabled 属性设置为 false 来防止输入到其他窗口。确保在关闭“对话框”窗口之前重新启用它们。
  • @HansPassant 感谢您的评论。我没有真正理解你的第一部分。我无法影响表单的显示方式,它由SplashScreenManager 调用,所以我不能自己调用​​Show(owner)
  • 你可能会觉得this很有趣

标签: c# .net winforms devexpress


【解决方案1】:

用途:

TopLevel = true;

这将完全符合您的要求;只要显示主窗体就位于最顶层,如果主窗体被另一个窗口隐藏,则隐藏。

您可以在不使用 .Show(owner) 的情况下将启动表单的所有者明确设置为主表单。

splashForm.Owner=mainForm;
splashManager.Show(splashForm);

【讨论】:

    【解决方案2】:

    我们不想要 TopMost 属性,因为它适用于窗口级别并且也覆盖其他窗口(例如浏览器)。 最后,我连接了窗口的焦点事件,以确保窗口始终位于顶部。

    【讨论】:

      猜你喜欢
      • 2021-10-15
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多