单击父对话框时将无模式子对话框置于顶部

本文关键字:对话框 模式 于顶部 单击 | 更新日期: 2023-09-27 18:36:43

我正在用C# WPF .NET 3.5开发一个应用程序。我有一个主窗口 M,从中我打开一个无模式的子窗口 C1,其中未使用 Window.Show() 方法设置所有者属性。从 C1 窗口我创建另一个子窗口 C2。从 C2 我创建了另一个子窗口 C3。C2 和 C3 都是无模式的,使用 Window.Show() 方法创建,并且未设置 Owner 属性。以下是窗口的顺序:

M ->

C1 -> C2 -> C3

我希望窗口行为如下所示。如果单击 C1 并且 C2 处于打开状态,则 C2 将置于顶部。如果将 C2 置于顶部,或者单击 C2,并且如果 C3 处于打开状态,则 C3 将置于顶部。如果单击 M,则 M 应该排在顶部。因此,C1、C2 和 C3 的行为类似于模态窗口。但是,我不希望 C1、C2 和 C3 实际上是模态的,即我不想使用 Window.ShowDialog() 方法和所有者属性集创建它们。这是因为我希望用户能够在需要时转到主窗口 M。如何实现此行为?

我提前感谢您的帮助。

极客猫头鹰

更新:

我根据建议在父窗口中添加了 GotFocus 事件手柄,但 GotFocus 事件没有被触发。所以我添加了激活的事件处理程序,并在这个处理程序中称为子窗口的 Activate()。这几乎解决了问题,但在某些情况下,这种方法并不完美。例如,当子项最小化并单击父项时,子项将被激活,但子项不会自动最大化。我试图使用其他方法而不是使用Activate()将孩子带到顶峰,但没有一个给出完美的解决方案。最终,我使用该方法在显示子窗口后隐藏父窗口,并在子窗口关闭时再次显示父窗口。

单击父对话框时将无模式子对话框置于顶部

如果窗口都使用 Control.Focus() 方法相互引用,您应该能够执行此操作。

您将向 C1 添加一个将调用 C2 的事件处理程序。Focus() 当它被单击时。 您将对调用 C2 执行相同的操作。焦点()。

根据我从您的问题中收集到的内容,我认为您添加处理程序的最佳事件是 C1 和 C2 窗口中的 GotFocus 事件。 基本上,每当它们"获得焦点"时,您都会检查它们的子窗口是否打开,然后在子窗口上调用 Focus()。 这将在该窗口上触发 GotFocus(因此,如果用户单击 C1,它将把 C2 带到顶部,然后将 C3 带到顶部)。