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

时间:2012-06-11 12:56:11

标签: c# wpf

我正在使用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实际上是模态的,即我不想用带有Owner属性设置的Window.ShowDialog()方法创建它们。这是因为我希望用户能够在需要时转到主窗口M.我怎样才能实现这种行为?

我事先感谢你的帮助。

geekowl

更新

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

1 个答案:

答案 0 :(得分:2)

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

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

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