Windows窗体不会在调试模式下显示

时间:2013-07-30 19:37:32

标签: c# forms debugging visual-studio-2012

我最近升级到VS 2012.我有一组编码的UI测试,我在VS 2010中编码,我正在尝试在VS 2012中将它们旋转。我有一个我正在显示的窗体使用AssemblyInitialize属性运行测试的开始。我使用此表单允许用户从值集中进行选择,这些值用于为测试提供数据。这是我的代码的副本,显示表单:

[AssemblyInitialize]
public static void AssemblyInitialize(TestContext context)
{
    ProcessUtility.TerminateAll();
    if (!File.Exists(Directory.GetCurrentDirectory() + @"\RunInfo.ser"))
    {
        InitializeForm initForm = new InitializeForm();
        initForm.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
        initForm.ShowDialog();
    }
}

所以,这是我的头疼:表单在运行模式下显示正常。但是,如果我尝试在调试模式下将其旋转,它将永远不会显示。我已经介入了代码。它正在加载表单的所有控件而没有错误。我将它转换为'initForm.ShowDialog()'代码行。它运行该行代码,但没有任何反应。我没有收到任何错误,IDE左下角的状态为“Ready”。这几乎就像IDE认为表单显示但不是。我已经仔细检查了任务管理器,但它不在那里。我已经验证了构建配置是否设置为Debug。我试过清理解决方案并重新构建。此代码继续在VS 2010中运行。请告诉我有人遇到类似的问题因为我没有想法。我是stackoverflow的新手,所以请告诉我是否还有其他任何东西可以更好地解释这个问题。提前感谢您看一下。

4 个答案:

答案 0 :(得分:1)

初始化过程中很可能发生异常,请转到Debug->Exceptions下拉菜单,确保选中thrown复选框Common Language Runtime Exceptions,这样您的代码就会中断正在发生的例外。

enter image description here

如果您仍然没有抓住例外,请转到Debug->Option and Settings,然后取消选中Enable Just My Code的复选框,并选中Break when exceptions cross AppDomain or managed/native boundries

复选框

enter image description here

这可能会给你一些“读鲱鱼”异常,因为一些.NET进程使用异常来控制流逻辑。所以请注意,您看到的第一个异常可能不是导致问题的原因。

答案 1 :(得分:1)

我能够使用以下代码而不是ShowDialog来显示表单。我仍然不知道为什么ShowDialog不能正常工作,但这样做的诀窍是:

InitializeForm initForm = new InitializeForm();
initForm.Visible = true;
initForm.Focus();
Application.Run(initForm);

答案 2 :(得分:1)

不确定为什么这个解决方案有效,但我能够在VS2013中解决这个问题,方法是在我尝试显示的表单上设置visible属性,然后在调用ShowDialog之前设置为false。

VB.Net示例代码

Dim form as Form = new Form
form.Visible = True
form.Visible = False
form.ShowDialog

答案 3 :(得分:0)

我在调试旧代码时遇到了同样的问题,并通过在包含[STAThread]的容器方法之上添加form.ShowDialog();属性来解决问题 例如:

[STAThread]
public void MessageBoxShow(string errorMessage)
{
    using (frmError errorForm = new frmError(errorMessage))
    {
        errorForm.ShowDialog();
    }
}

这解决了在击中持续调试点时发生的任何悬挂问题。 平台Windows 7 x64企业版和VS2008(两者都有截至今天的最新更新)。

希望这有帮助。

更新1:请忽略示例中的using语句,因为我使用的自定义表单除了Windows.Form之外还继承了IDisposable并具有自定义处理例程。对不起,如果它造成任何混淆。