涉及TopMost和Invoke的Z-Order问题

时间:2009-04-06 11:56:18

标签: .net winforms invoke z-order topmost

我正在使用Form.ShowDialog()显示Dialogs。表单设置为TopMost。某些图像处理计算在后台异步执行。它们的结果由Invoke以主窗体呈现。到现在为止还挺好。奇怪的是,模态对话框时不时会移动到主窗体后面。我想当构建对话框的消息以某种方式被Invoke“干扰”时会发生这种情况。

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

作为一般规则,除非绝对不能,否则请避免使用TopMost。如果绝对不能,一次不要有多个TopMost表单。 (毕竟,不可能有三种TopMost表格 - 有人会丢失)。

首先,请在致电Form.ShowDialog()时确认您是否正确设置了所有者。这将使新表单更有可能出现在适当的位置,并全面改善应用程序的行为。其次,验证您在任何时候只有一个TopMost窗口。完成这些事情的失败肯定会导致你的问题。 E.g:

// MainForm.cs -- Don't do this
this.TopMost = true;
childForm.TopMost = true;
childForm.ShowDialog(/*no parent spec'd*/);

现在会发生什么?主要形式和儿童形式都是最顶级的,因此其中一种形式会失败。 MainForm在创建childForm时最活跃,但是childForm没有父级。也许Windows决定让桌面成为其父级。这可能导致主表单保留在新打开的子表单上。

答案 1 :(得分:0)

也许您可以尝试将拥有的表单作为参数传递给ShowDialog,就像那样(VB语法):

Form.ShowDialog(Me)

不确定它是否会改变任何东西,但值得一试......

另外,当你说“表格设置为TopMost”时,你的意思是主表格还是模态表格?你真的需要把它设置为TopMost吗?有时TopMost形式有奇怪的行为......