MDI 应用中的“部分模态”表单

本文关键字:模态 部分模态 表单 应用 MDI | 更新日期: 2023-09-27 17:56:51

我有一个MDI应用程序。用户可以打开不同的非模态表单,例如表单 A 和表单 B。在表单 A 上有一个按钮可以打开另一个表单(假设表单 C),表单 B 也是如此(打开表单 D 的按钮)。我试图实现的是让 C 阻止 A 和 D 阻止 B。ShowDialog 不起作用,因为它阻止了整个应用程序,所以我尝试禁用表单 A,然后在 C 关闭时设置为 false 的布尔值上循环一段时间(即:while (阻止)Application.DoEvents();)。在下面的代码行中,我重新启用 A,然后使用从 C 获得的结果。它似乎有效,但是如果我从 A 打开 C,然后从 B 打开 D,A 会被 C 和 D 阻止,而不仅仅是被 D 阻止。有没有办法实现我想要做的事情?

MDI 应用中的“部分模态”表单

也许像

这样模拟你想要的东西会更好:

  1. 当 A 打开 C 时,将该引用保留在 A 类中(不在某个方法中,但对其他方法可见)
  2. 当表单 A 收到 Activate 事件时,请检查 C 是否可见 - 如果是,请将其聚焦。

B-D也是如此,无论哪种组合...

您可以使用 Form.Activate 来强制使用某种模态。例如,当 D 阻止 B 并且用户选择(激活/设置焦点)B 时,您可以在 D 上调用 Form.Activate 。它不是完全模式,但会强制执行您的表单到表单关系。当然,当没有 D 来阻止 B 时,您不会调用 Activate。这种方法还将消除使用 DoEvents 的需要,因为没有表单会被真正锁定。

最后是

这样解决的:
在打开 C I
的 A 的方法中1. 禁用表单 A
2. 创建一个 C 的实例(如果我在 C 关闭后需要它的一些数据,并将其存储在 A 的字段中)
3. 将类 A 中定义的方法 cClosed 附加到 C
实例的事件 FormClosed4. 打开表格 C

在方法cClosed I中:
1. 重新启用表单 A
2. C
关闭后做任何我需要的事情3. 清除包含 C 的字段(如果存在)