当所有表单关闭

时间:2018-02-12 07:40:01

标签: vb.net forms events shutdown formclosing

我想创建一个包含两个表单的应用程序,一个名为Source的主要表单和一个名为Viewer的子公司。使用每个表单上的按钮,用户可以切换到另一个,即使该表单先前已关闭,也可以切换到。因此,我将程序设置为关闭最后一个表单时关闭。此外,我在每个表单关闭时添加了消息框,只是为了检查用户是否确定。

但是现在关闭这两个表单后我的应用程序都不会退出!它显示在任务管理器中,如果我在MSVS中运行它,调试器永远不会停止!当每个表单关闭时,My.Application.Forms返回一个空集合。如果我强制使用End / Application.Exit退出,程序仍会退出 - 请参阅下面的MWE。 我该怎么办?

MWE

创建一个空白的VB.NET Windows窗体项目。在项目设置的“应用程序”选项卡中,选择“最后一个表单关闭时关闭”。在设计器中,使用一个按钮创建一个表单Source

Public Class Source

Public Sub Switch(sender As Object, e As EventArgs) Handles Button1.Click
    My.Forms.Viewer.Show()
End Sub

Public Sub Free(sender As Object, e As FormClosingEventArgs) Handles Me.Closing
    e.Cancel=(MsgBoxResult.Cancel=MsgBox("Are you sure?"))
End Sub

'Public Sub Test(sender As Object, e As EventArgs) Handles Me.Closed
    'Debug.Assert(Not My.Application.Forms.Count))
    'If the next line is uncommented, the application will close, like we want
    'If Not My.Forms.Viewer.Visible Then Application.Exit()
'End Sub

End Class

然后创建一个名为Viewer的相同表单。

Public Class Viewer

Public Sub Switch(sender As Object, e As EventArgs) Handles Button1.Click
    My.Forms.Source.Show()
End Sub

Public Sub Free(sender As Object, e As FormClosingEventArgs) Handles Me.Closing
    e.Cancel=(MsgBoxResult.Cancel=MsgBox("Are you sure?"))
End Sub

'Public Sub Test(sender As Object, e As EventArgs) Handles Me.Closed
    'Debug.Assert(Not My.Application.Forms.Count))
    'If the next line is uncommented, the application will close, like we want
    'If Not My.Forms.Source.Visible Then Application.Exit()
'End Sub

End Class

最后尝试关闭任何表格。两者都不会导致应用退出。

1 个答案:

答案 0 :(得分:1)

请勿使用Form.ClosingForm.Closed

Form.Closing的MSDN页面中,它备注:

  

注意

     

Closing事件在.NET Framework 2.0版[及更高版本]中已过时;请改用FormClosing事件。

事件已弃用,因为

  

调用Form.Closed方法退出应用程序时,不会引发Form.ClosingApplication.Exit事件。如果在必须执行的这些事件中都有验证代码,则应在调用Exit方法之前单独为每个打开的表单调用Form.Close方法。

MSDN文档没有说明这一点,但反之亦然:为了让表单向表示已关闭的表单Form.Closing和{{1}的VB.NET运行时发出信号无法订阅

如果您将Form.Closed替换为Me.Closing,将Me.FormClosing替换为您的MWE中的Me.Closed,则可行。