1

我正在用 C# WPF .NET 3.5 开发一个应用程序。我有一个主窗口 M,我从中打开一个无模式子窗口 C1,其 Owner 属性未使用 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() 方法和 Owner 属性集来创建它们。这是因为我希望用户能够在需要时转到主窗口 M。我怎样才能实现这种行为?

我提前感谢您的帮助。

极客

更新:

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

4

1 回答 1

2

如果您的窗口都使用Control.Focus()方法相互引用,您应该能够做到这一点。

您将向 C1 添加一个事件处理程序,该处理程序将在单击时调用 C2.Focus()。C2 调用 C3.Focus() 也会这样做。

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

于 2012-06-11T13:00:49.980 回答