Form.ShowDialog()在启用调试时不会显示窗口。

20

我已经在一个单元测试项目中创建了一个测试,其中我想使用ShowDialog()函数弹出一个表单

[TestMethod]
public void TestDialog()
{
  // This class inherits from Form
  TestForm serviceTestForm = new TestForm("My test form"); 
  serviceTestForm.ShowDialog();

  return;
}

我希望这个测试可以到达ShowDialog()方法,并且在我关闭窗口之前一直运行。然而,当我使用"调试"运行此测试时,测试会到达ShowDialog(),但没有窗体显示出来。奇怪的是,如果我不使用调试运行,这个完全相同的测试就可以正常工作。

我需要能够在"调试"模式下运行测试并显示窗口。

其他注意事项:

  • Show()方法不可取,因为它不会等待窗口关闭才继续。 (而且...它不起作用。)
  • 这段代码曾经在另一个使用.NET 3.5的项目中成功运行过。这只是说ShowDialog()方法策略以前肯定起作用了。(是的,我直接复制了那个可运行的代码。)
  • 我的问题类似于这个问题,但我的窗体不是另一个对话框的子级,也不在父UI线程内。
2个回答

36

尽管我尽量避免编写使用System.Windows.Forms的单元测试,但我遇到了一个需要这样做的奇怪情况,并通过处理Load事件并显式设置Visible = true来解决了这个问题。 当从测试方法调用ShowDialog时,这将强制显示窗体。

private void form1_Load(object sender, EventArgs e)
{
    // To support calling ShowDialog from test method...
    this.Visible = true;
    ...
}

或者,只需从测试方法中观察表单实例并在那里执行相同的操作。至少这样可以缓解问题,因为它将“hack”保持在表单代码之外。


Alternatively, just observe the form instance from your test method and do the same there instead. At least this mitigates the issue further in that it keeps the hack out of your form's code.
var frm = new Form1();
frm.Load += (sender, e) => (sender as Form1).Visible = true;
frm.ShowDialog();

我遇到了一种罕见的情况,需要这个东西,你的回答帮了我很大的忙。然而,我意识到我可以在测试中创建表单对象,然后将myform.visible = true设置为测试中的形式。完美地工作 :) - RosieC
2
David 提供的代码在 VS2013 上对我来说运行良好。然而,在 VS2015 上,它停止显示表单。非常感谢您的帮助,lambda 表达式很有用。 - Mike Makarov
这对我在VS2017上解决了问题,在那里由于VS崩溃而出现了这个问题。 - Jens
当 ReSharper 的更新似乎开始引起这种行为时,这个方法解决了我的问题。 - csrowell
这是一个ReSharper问题,如果您想在那里发表评论,请访问以下链接:https://youtrack.jetbrains.com/issue/RSRP-468681 - csrowell
世界上怎么回事?有些对话框可以工作,有些却不行。这是什么原因呢? - richard

0
在我的情况下,使用VS2017,将属性ShowInTaskbar设置为false就可以解决问题了。
这是用于显示对话框的完整代码:
form.TopMost = true;
form.StartPosition = FormStartPosition.CenterScreen;
form.ShowInTaskbar = false;
form.ShowDialog();

顺便说一句,找到这个解决方案后,我在在单元测试方法中显示Windows表单中看到了相同的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接