C# MDI应用程序中的“部分模态”表单

C# MDI应用程序中的“部分模态”表单,c#,modal-dialog,mdi,C#,Modal Dialog,Mdi,我有一个MDI应用程序。用户可以打开不同的非模态表单,例如表单A和表单B。在表单A上有一个按钮可以打开另一个表单,比如表单C,表单B A按钮打开表单D也是如此。我试图实现的是让C阻止A和D阻止B。 ShowDialog无法工作,因为它会阻止整个应用程序,所以我尝试禁用表单A,然后在关闭C时设置为false的布尔值上循环while,即:while blocked Application.DoEvents;。在下面的代码行中,我重新启用了A,然后使用从C获得的结果。 这似乎是可行的,但如果我从A打开

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

也许最好像这样模拟你想要的:

当A打开C时,将该引用保留在A类中,不在某个方法内,而是对其他方法可见 当表单A接收到激活事件时,检查C是否可见-如果是,则将其聚焦。
B-D也一样,不管是什么组合

也许最好像这样模拟您想要的:

当A打开C时,将该引用保留在A类中,不在某个方法内,而是对其他方法可见 当表单A接收到激活事件时,检查C是否可见-如果是,则将其聚焦。
B-D也一样,不管是什么组合

你可以用它来强制一种形式。例如,当D阻止B并且用户选择激活/将焦点设置为B时,您可以调用D上的Form.Activate。它不是完全模态的,但会强制您的表单与表单之间的关系。当然,当B区没有D时,您不会调用Activate。这种方法也将消除使用的需要,因为没有任何形式会真正被锁定。

您可以使用强制某种形式。例如,当D阻止B并且用户选择激活/将焦点设置为B时,您可以调用D上的Form.Activate。它不是完全模态的,但会强制您的表单与表单之间的关系。当然,当B区没有D时,您不会调用Activate。这种方法还可以避免使用,因为没有表单会被真正锁定。

最终通过以下方式解决了这个问题: 用A的方法打开C I 1.禁用表格A 2.创建一个C的实例并将其存储在a的字段中,如果在关闭C后我需要它的一些数据 3.将类a中定义的方法cClosed附加到C实例的事件FormClosed 4.公开表格C 在方法cClosed I中: 1.可重入表格A 2.在C结束后做我需要的任何事
3.清除包含C的字段(如果存在)

,最后按以下方式解决: 用A的方法打开C I 1.禁用表格A 2.创建一个C的实例并将其存储在a的字段中,如果在关闭C后我需要它的一些数据 3.将类a中定义的方法cClosed附加到C实例的事件FormClosed 4.公开表格C 在方法cClosed I中: 1.可重入表格A 2.在C结束后做我需要的任何事
3.清除包含C的字段(如果存在)

通过禁用A,将A的方法附加到C的结束事件上,重新启用它,然后显示C,可以实现相同的效果。但这将阻止我使用从使用C获得的结果。我可以将其用于A的重新启用方法,但我宁愿避免这种情况,因为我应该数千次替换现有的打开说明。禁用,将a的方法附加到C的结束事件,该方法重新启用C,然后显示C。但这将阻止我使用从使用C获得的结果。我可以将其用于a的重新启用方法,但我宁愿避免这种情况,因为我应该数千次替换现有的打开说明。禁用,将a的方法附加到C的结束事件,该方法重新启用C,然后显示C。但这将阻止我使用从使用C获得的结果。我可以将其用于a的重新启用方法,但我宁愿避免这种情况,因为我应该数千次替换现有的打开说明。禁用,将a的方法附加到C的关闭事件,该方法将重新启用它,然后显示C。但这将阻止我使用从使用C获得的结果。我可以将其用于a的重新启用方法,但我宁愿避免这种情况,因为我应该数千次替换现有的打开说明。