0

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

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

4

2 回答 2

1

作为一般规则,除非绝对不能,否则请避免使用 TopMost。如果你绝对不能,一次不要有超过一个 TopMost 表格。(毕竟,不可能有三种 TopMost 形式——总要有人输)。

首先,验证您在调用时正确设置了所有者Form.ShowDialog()。这将使新表单更有可能出现在适当的位置并全方位改进应用程序的行为。其次,验证您在任何时候都只有一个 TopMost 窗口。做这些事情的综合失败肯定会导致你的问题。例如:

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

现在会发生什么?主窗体和子窗体都在最顶层,因此必须丢失其中一个。MainForm 在将 childForm 创建为最顶层时处于活动状态,但 childForm 没有父级。也许 Windows 决定将桌面作为其父级。这可能会导致主窗体停留在新打开的子窗体上。

于 2009-04-08T04:18:39.320 回答
0

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

Form.ShowDialog(Me)

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

另外,当您说“表单设置为 TopMost”时,您是指主表单还是模态表单?您真的需要将其设置为 TopMost 吗?有时 TopMost 表单有奇怪的行为......

于 2009-04-08T04:05:12.940 回答