Showdialog исчезает при использовании alt + tab - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть MDI-контейнер, а также я использую свой собственный пользовательский класс MsgBox с именем ShowMsg, который я использую в основном в дочерних формах, пока он работал нормально, пока я не понял, что Showmsg (который является ShowDialog) не прилипает кродительская форма (MDIContainer).

В дочерней форме я использую поток для запуска процесса и показываю индикатор выполнения, если пользователь переключается на другую программу с помощью вкладки alt +, когда процесс работает и завершается, когда пользователь возвращается в мое приложениеиспользуя Alt + Tab, ShowMsg не существует, он исчезает, и я ничего не могу сделать, чтобы вернуть его, поэтому мое приложение становится бесполезным.

Это происходит только при вызове его из другого потока, чем сама формаЯ срываю свои волосы с этим, почему исчезает ????

Это часть кода:

Public Function ShowMsg(ByVal Text As String, ByVal Icon As ShowMsgImage, ByVal Title As String) As DialogResult
    Dim SMF As New ShowMsgForm

    'Set the title bar
    SMF.Text = Title

    'Select an image and sound based on the Icon parameter
    Select Case Icon
        Case ShowMsgImage.Alert
            SMF.MessagePictureBox.Image = My.Resources.ico_showmsg_Warning
            SMF.Sound = Media.SystemSounds.Asterisk
        Case ShowMsgImage.Confirm
            SMF.MessagePictureBox.Image = My.Resources.ico_showmsg_Confirm
            SMF.Sound = Media.SystemSounds.Question
        Case ShowMsgImage.Critical
            SMF.MessagePictureBox.Image = My.Resources.ico_showmsg_NotAllowed
            SMF.Sound = Media.SystemSounds.Hand
        Case ShowMsgImage.Info
            SMF.MessagePictureBox.Image = My.Resources.ico_showmsg_Info
            SMF.Sound = Media.SystemSounds.Asterisk
        Case ShowMsgImage.Security
            SMF.MessagePictureBox.Image = My.Resources.ico_showmsg_Lock
            SMF.Sound = Media.SystemSounds.Beep
        Case ShowMsgImage.UnderConstruction
            SMF.MessagePictureBox.Image = My.Resources.ico_showmsg_NotAllowed
            SMF.Sound = Media.SystemSounds.Asterisk
        Case ShowMsgImage.Ok
            SMF.MessagePictureBox.Image = My.Resources.ico_showmsg_ok
            SMF.Sound = Media.SystemSounds.Asterisk
    End Select

    'Set other properties
    SMF.TextLabel.Text = Text
    SMF.QuestionTextLabel.Text = ""
    SMF.Button1.Visible = True
    SMF.Button1.Text = "OK"
    SMF.Button1.DialogResult = DialogResult.OK
    SMF.Button2.Visible = False
    SMF.Button3.Visible = False

    'Resize the form
    SMF.SizeForm()

    'Set its starting position
    SMF.StartPosition = FormStartPosition.CenterScreen

    'Display the form modally and return its DialogResult
    Try
        Return SMF.ShowDialog()
    Catch ex As Exception

    End Try


End Function

Пример на ребенка:

Private Sub btnGo_Click(sender As Object, e As EventArgs) Handles btnGo.Click
    Dim backgroundThread As New Thread(AddressOf Processdata)
    backgroundThread.Start()

End Sub

Sub ShowMsgDelegate(msg As String)
    ShowMsg(msg, ShowMsgImage.Ok, "")
End Sub

Delegate Sub MyDelegate(ByVal msg As String)

Private Sub Processdata()
    'Do stuff and when finished...
    Me.Invoke(New MyDelegate(AddressOf ShowMsgDelegate), New Object() {"Done"})
End Sub

1 Ответ

0 голосов
/ 28 февраля 2019

После нескольких дней и тестов, я думаю, что я нашел ответ.

Я добавил:

  • TopLevel = True при отображении
  • Paramenter ParentForm

            SMF.TopLevel = True
            Return SMF.ShowDialog(**frm**)
    

Где frm - форма, вызывающая ShowMsg

...