如何获取当前活动模态表单的引用?

我正在编写一个小类来驱动win表单应用程序的集成测试。 测试驱动程序类可以访问主窗体并查找需要按名称使用的控件,并使用它来驱动测试。 要查找控件,我将遍历Control.Controls树。 但是,当我想在对话框窗口(显示为对话框的自定义窗体)中获得控件时,我会陷入困境。 我该如何掌握它?

您可以使用静态Form.ActiveForm属性获取对当前活动表单的引用。

编辑:如果没有Form具有焦点, Form.ActiveForm将返回null
解决此问题的一种方法是使用Application.OpenForms集合并检索最后一项,当使用ShowDialog显示时,将是活动Form

 // using Linq: lastOpenedForm = Application.OpenForms.Cast
().Last() // or (without Linq): lastOpenedForm = Application.OpenForms[Application.OpenForms.Count - 1]

我不确定你是否可以访问预建对话框上的控件; 他们似乎都打包在一起。 您可以更幸运地构建一个自己的对话框来完成您希望它做的事情。 然后你可以访问它内部的.Controls。

如果我错了,请纠正我,但听起来好像你可能试图访问对话框表单上的控件时,这是不可能的。

我的意思是, ShowDialog将“保持”创建表单的线程,并且不会将控制权返回给应用程序(或您的测试类),直到ShowDialog完成处理,在这种情况下,您的用户代码将继续在其上路径。

尝试从单独的线程访问或操作控件(在这种情况下,重构测试驱动程序类,为每个必须显示和测试的新表单生成一个单独的线程)。