2013-01-31 160 views
2

我有一个主窗体,它打开窗体A,从窗体AI可以打开窗体B,从窗体BI可以打开窗体C.问题是如果我打开窗体B,一切正常很好,但如果我也打开表单C,然后关闭表单C和B,表单A就会落后于主表单。对于形状余米只是创造形式的实例,然后使用.Show()在c中失去焦点#

cNewForm form = new cNewForm(); 
form.Show(); 

我在做这为每个表单

+0

'形式拥有C型.Focus()'? –

+0

这是你的意图,显示窗体无模式(所以你可以随时访问任何形式)?或者你是否打算按照你所描述的方式堆叠它们?如果你打算把它们堆叠起来(在表单C关闭之前不能使用表单B等等),那么你可以尝试使用.ShowDialog()来代替。 –

+0

您可以使用BringToFront方法来解决您的问题。是否设置了TopMost属性的主窗口? – gustavodidomenico

回答

2

,因为你正在使用的Show()无参数版本,您没有设置窗口所有权正确。您需要通过调用接收所有者参数的Show()重载来设置所有者。或者,您可以直接设置Owner属性,但在拨打Show()时,更好。

窗口所有者是一个重要的Win32概念。我建议阅读关于这个主题的MSDN documentation

  • 一个拥有的窗口始终位于其所有者的z顺序之上。
  • 系统在其拥有者被销毁时自动销毁拥有的窗口。
  • 拥有窗口在其所有者最小化时隐藏。

在你的情况我想你想形式的由主窗体所拥有,形状B由形式的拥有,并通过形式B.

+0

实际上问题是通过将Form Border Style设置为Sizable来解决的,任何人都知道为什么? – user2029200

+0

可能是因为导致重新创建窗口句柄并且所有者设置正确。你描述的行为肯定是由不正确的所有者。注意要点1.如果所有者设置正确,您的报告行为不会发生。 –

0

尝试使用ShowDialog();梅索德代替show(),以显示它作为模态形式。请参见documentation

+0

大概选择了Show是因为该设计的形式是无模式的。 –

1

我经常发现通过将所有者分配给Windows可以解决这些类型的问题。当显示窗口:

FormA formA = new FormA(); 
formA.Show(this); // assuming this code is in the main form