У меня есть 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