VB.NET Windows 表单 - 暂时禁用关闭 'X' 按钮

VB.NET Windows Forms - Temporarily Disable Close 'X' Button

我有一个表单可以在 运行 执行某些计算的 BackgroundWorker 之前提示用户进行确认。这些计算可能需要 10-30 秒到 运行,我想确保一旦计算开始 运行,它们就可以不间断地完成。

有没有办法暂时禁用标题栏中的关闭按钮,直到 BackgroundWorker 完成其工作?

我发现了几个类似的问题,但它们看起来像是一个更永久的解决方案 (here and )。我希望仅在 BackgroundWorker 执行其工作时暂时禁用关闭按钮。

如有任何帮助,我们将不胜感激。谢谢!

禁用关闭按钮将是极端糟糕的品味。修复您的应用程序,以便计算可以中断。

我同意不隐藏 'X' 但如果你真的想要它,我想这就是你要找的东西:

Disable Close Button in Vb.Net

Private ImBusy As Boolean = False

Private Sub LookBusyForTheBoss()
    Me.UseWaitCursor = True
    Me.Cursor = Cursors.WaitCursor
    Me.Enabled = False
    ProgressBar1.UseWaitCursor = False
    ProgressBar1.Style = ProgressBarStyle.Marquee

    ImBusy = True
End Sub

Private Sub Form77_FormClosing(...) Handles Me.FormClosing
    If ImBusy Then e.Cancel = True
End Sub

Private Sub OkHeIsGone()
    Me.UseWaitCursor = False
    Me.Cursor = Cursors.Default
    Me.Enabled = True

    ImBusy = False
End Sub

按照这些思路可能会起作用:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    doNotClose = True
    Do
        '
        'etc
        '
        'simulate long running 
        For x As Integer = 1 To 1000
            Threading.Thread.Sleep(10)
        Next
        Exit Do
    Loop
    doNotClose = False
    If closerequested Then
        Me.BeginInvoke(Sub()
                           Me.Close()
                       End Sub)
    End If
End Sub

Dim doNotClose As Boolean = False
Dim closerequested As Boolean = False

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    closerequested = True
    If doNotClose Then
        e.Cancel = True
        Exit Sub
    End If
End Sub

或这个

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    doNotClose = True
    Do
        '
        'etc
        '
        'simulate long running 
        For x As Integer = 1 To 1000
            Threading.Thread.Sleep(10)
        Next
        Exit Do
    Loop
    doNotClose = False
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    If closerequested Then
        Me.Close()
    End If
End Sub

Dim doNotClose As Boolean = False
Dim closerequested As Boolean = False

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    closerequested = True
    If doNotClose Then
        e.Cancel = True
        Exit Sub
    End If
End Sub