如何将窗口置于应用程序中其他窗口的顶部?

3
我想在我的C# Windows Forms应用程序中显示一个状态窗口,以通知用户应用程序正在等待获取锁定。这是一个应用程序定义的事情,但是窗口应该可见,并始终保持在我的应用程序的所有其他窗口的顶部,即使用户单击另一个窗口(例如在其后面的更大的主窗口)。
它不能是模态的(因此不能使用ShowDialog()),因为应用程序需要在后台继续尝试并自动关闭窗口,如果最终可以获取锁定,则确实不应该是整个窗口站的最上层(即在该终端会话中运行的所有应用程序)。
我知道Form.TopMost属性,但它只能将一个窗口置于所有其他窗口的上方,甚至包括来自其他应用程序的窗口。这显然不是我要找的。
我知道这是可能的,在其他应用程序中我已经看到过很多次。我只是不知道如何做到这一点。

虽然不是直接相关的,但如果您想在主父窗体上启动多个不同的表单类并保持原始打开事件的时间轴,则完全省略所有者属性。这样,父窗口打开的每个子窗口都将保持打开状态,并位于父窗口之上。只有在与父窗口交互时才隐藏,但在与父窗口打开的其他子窗口交互时仍会保持激活但失去焦点。不一致地使用所有者属性会导致子窗口出现奇怪和不稳定的行为。 - IbrarMumtaz
2个回答

9
如果你将主表单传递给状态表单的 Show 方法,它将保持在主表单的顶部,但不会覆盖其他应用程序。因此,在主表单中,你可以使用以下代码:
StatusForm statusForm = new StatusForm();
statusForm.Show(this);

然而,这只会指定你应用程序中一个窗口作为所有者。

它似乎也可以与多个窗口一起使用(至少是同一Form类的多个实例)。它们都保持在所属窗口的前面。 - ygoe

4

您需要设置子窗体的Owner属性为父窗体,并使用Show方法显示子窗体。


谢谢,两个解决方案都很好用。不幸的是我只能标记一个答案为被接受的解决方案(但我会给两个答案点赞)。我还发现将所拥有窗口的ShowInTaskbar属性设置为false是个好主意,这样它们就不会破坏任务栏和Alt+Tab窗口列表了。 - ygoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接