【问题标题】:VB .NET application not exiting when all forms close所有表单关闭时 VB .NET 应用程序未退出
【发布时间】:2018-02-12 07:40:01
【问题描述】:

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

但是现在我关闭两个表单后我的应用程序不会退出!它显示在任务管理器中,如果我在 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

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

【问题讨论】:

    标签: vb.net forms events shutdown formclosing


    【解决方案1】:

    不要使用Form.ClosingForm.Closed

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

    注意

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

    这些事件已被弃用,因为

    当调用Application.Exit 方法退出应用程序时,不会引发Form.ClosedForm.Closing 事件。如果您在其中任何一个事件中有必须执行的验证代码,则应在调用 Exit 方法之前为每个打开的表单单独调用 Form.Close 方法。

    MSDN 文档没有说明这一点,但 反之亦然:为了让您的表单向 VB.NET 运行时发出该表单已关闭的信号,Form.ClosingForm.Closed 不能订阅。

    如果您在 MWE 中将 Me.Closing 替换为 Me.FormClosing 并将 Me.Closed 替换为 Me.FormClosed,则可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多