2010-07-08 34 views
17

好吧,我正在寻找一些非常简单的东西:创建一个不停止我的代码的MessageBox。创建不停止代码的MessageBox?

我猜我必须创建一个不同的线程或东西?请告知最好的方法来完成这一点。

谢谢!

回答

9

不,您将不得不制作自己的消息框表单。 MessageBox类仅支持类似于.ShowDialog()的行为,这是一种模态操作。

只需创建一个新表单,该表单可以接受参数并使用这些参数来构建一个符合您喜好的样式化消息框。


更新2014年7月31日

在保持清晰的谁比谁通过谷歌认为这精神,我想花一秒钟来解释这个有点多:

引擎盖下MessageBoxWindows SDK user32.dll MessageBox Function周围看上C#包装,从而精确地进行同样的操作(转换.NET枚举成代表在系统调用的同一事物的整数后。

这意味着当你拨打MessageBox.Show()时,呼叫被封送到操作系统,并将阻止当前线程,直到选择一个选项或窗口被终止。为了防止您的代码被暂停,你需要启动一个单独的线程的消息框,但是这将意味着是来自于消息框后面(有任何结果/没有//取消 /等......)将被返回到负责调用消息框的单独线程。

如果您按照这种方式启动此消息框的结果,您将不得不将结果发送回UI Thread for Thread Saftey。

或者,您可以在WinForms/WPF中创建自己的消息框表单,并使用.Show()方法调用它。按钮上的任何点击事件都将在UI线程上执行,您不必将调用回调到UI线程来操作UI中的事物。

+0

好吧,所以我只需要创建自己的表单。 非常可行,谢谢! – sooprise 2010-07-08 16:10:42

+0

所以如果我有'Messagebox.Show(MessageBoxButtons。OK)'程序会暂停,直到用户点击OK按钮?因为我想运行我的自动化进程,并且在前两个进程完成后,通过Messagebox暂停进程,然后在用户单击消息框后,让下一个自动化进程运行。 – HanH1113 2014-07-31 13:44:22

+0

@ HanH1113封面下的'MessageBox.Show()'方法有效地执行'.ShowDialog()'的相同方式。这是一个阻塞操作,因此执行会暂停,直到对话框关闭。我已经更新了我的答案,以便更清楚。 – Aren 2014-08-01 00:18:47

12

您可以通过在单独的线程上调用另一个消息泵来启动另一个消息泵。 MessageBox.Show泵信息,所以没有电话Application.Run是安全的。

public void ShowMessageBox() 
{ 
    var thread = new Thread(
    () => 
    { 
     MessageBox.Show(...); 
    }); 
    thread.Start(); 
} 

编辑:

我也许应该提到,我不建议这样做。它可能会导致其他问题。例如,如果您有两个线程抽取消息,则消息框可能会卡在另一个表单后面,如果表单正在等待某人关闭消息框,则无法使其消失。你应该尝试找出解决问题的另一种方法。

+0

'ThreadPool.QueueUserWorkItem(delegate {MessageBox.Show(“Text”);});':) – sunside 2010-07-08 16:24:35

+2

@Markus:这样做也可以做到这一点,除非它会挂起一个'ThreadPool'线程,这不会是一个好主意一般来说练习。 – 2010-07-08 16:31:29

+0

确实,你是对的。 – sunside 2010-07-08 16:34:54