调试模式下窗体无法显示

3

我最近升级到了VS 2012。我有一组在VS 2010中编写的代码UI测试,现在我想在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左下角的状态是“准备就绪”。就好像IDE认为表单已经显示出来了,但实际上并没有。我已经双重检查了任务管理器,它就是不存在。我已经验证了构建配置设置为调试。我已经尝试清理解决方案并重新构建。这段代码在VS 2010中仍然有效。请告诉我有人遇到过类似的问题,因为我已经没有想法了。我是stackoverflow的新手,请让我知道是否还有其他需要提供的信息以更好地解释这个问题。非常感谢您的关注。

你应该在那个窗体上调用.Dispose()方法。虽然这不会解决问题,但仍然是必要的。 - user1132959
1
可能是[Form.ShowDialog()在启用调试时无法显示窗口]的重复问题。链接 - csrowell
4个回答

3

不确定为什么这个解决方案有效,但我成功地在VS2013中通过将我尝试显示的窗体的可见属性设置为true,然后再调用ShowDialog之前设置为false来解决了这个问题。

VB.Net示例代码:

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

2

我用以下代码替代ShowDialog方法成功地显示了表单,但我仍然不知道为什么ShowDialog无法正常工作,以下代码可以解决问题:

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

1
在初始化期间很可能发生异常,进入 Debug->Exceptions 下拉菜单,并确保勾选了 Common Language Runtime Exceptionsthrown 复选框,这将使您的代码在发生异常时停止运行。

enter image description here

如果您仍然无法捕获异常,请转到 调试 -> 选项和设置,然后取消选中 启用只有我的代码 复选框,选中 当异常跨越应用程序域或托管/本机边界时中断 复选框。

enter image description here

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


感谢您的回复。我按照您的建议启用了CLR异常并更改了一些调试设置。不幸的是,它没有抛出任何异常。我逐步执行initForm.ShowDialog();代码行,但它仍然只是挂起...没有异常,也没有显示表单。还有其他想法吗?我非常感谢您的帮助。这让我发疯了。 - user2635491
我唯一能建议的是关注 Visual Studio 的“输出”窗口,有时它会告诉你某个地方被捕获了“第一次机会异常”,也许能给你一个开始查找的地方。 - Scott Chamberlain
谢谢你,Scott。我刚刚能够使用Application.Run而不是ShowDialog让它工作了。这是我第一次遇到ShowDialog的问题。好吧,窗体现在正在显示。 - user2635491

0
我在调试旧代码时遇到了同样的问题,并通过在包含form.ShowDialog();的容器方法顶部添加[STAThread]属性来解决了这个问题。 例如:
[STAThread]
public void MessageBoxShow(string errorMessage)
{
    using (frmError errorForm = new frmError(errorMessage))
    {
        errorForm.ShowDialog();
    }
}

这解决了在调试时出现的任何挂起问题。 平台为Windows 7 x64企业版和VS2008(两者都已更新至今天的最新版本)。

希望这能有所帮助。

更新1:请忽略示例中的using语句,因为我正在使用一个自定义表单,它继承了IDisposable以及Windows.Form,并具有自定义的处置程序。如果造成任何困惑,请原谅。


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