我想创建一个包含两个表单的应用程序,一个名为Source
的主要表单和一个名为Viewer
的子公司。使用每个表单上的按钮,用户可以切换到另一个,即使该表单先前已关闭,也可以切换到。因此,我将程序设置为关闭最后一个表单时关闭。此外,我在每个表单关闭时添加了消息框,只是为了检查用户是否确定。
但是现在关闭这两个表单后我的应用程序都不会退出!它显示在任务管理器中,如果我在MSVS中运行它,调试器永远不会停止!当每个表单关闭时,My.Application.Forms
返回一个空集合。如果我强制使用End
/ Application.Exit
退出,程序仍会退出 - 请参阅下面的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
最后尝试关闭任何表格。两者都不会导致应用退出。
答案 0 :(得分:1)
Form.Closing
和Form.Closed
在Form.Closing
的MSDN页面中,它备注:
注意
Closing
事件在.NET Framework 2.0版[及更高版本]中已过时;请改用FormClosing
事件。
事件已弃用,因为
调用
Form.Closed
方法退出应用程序时,不会引发Form.Closing
和Application.Exit
事件。如果在必须执行的这些事件中都有验证代码,则应在调用Exit方法之前单独为每个打开的表单调用Form.Close方法。
MSDN文档没有说明这一点,但反之亦然:为了让表单向表示已关闭的表单Form.Closing
和{{1}的VB.NET运行时发出信号无法订阅。
如果您将Form.Closed
替换为Me.Closing
,将Me.FormClosing
替换为您的MWE中的Me.Closed
,则可行。