好的,我正在寻找一些非常简单的东西:创建一个不会停止我的代码的MessageBox。
我猜我必须创建一个不同的线程或什么?请告知最佳方法。
谢谢!
答案 0 :(得分:14)
您可以通过在单独的线程上调用它来启动另一个消息泵。 MessageBox.Show
会发出消息,因此无需拨打Application.Run
即可安全发送。
public void ShowMessageBox()
{
var thread = new Thread(
() =>
{
MessageBox.Show(...);
});
thread.Start();
}
修改:
我可能应该提到我不建议这样做。它可能会导致其他问题。例如,如果您有两个线程在传递消息,那么消息框可能会卡在另一个表单后面,如果表单正在等待某人关闭消息框,则无法使其消失。你真的应该试图找出解决问题的另一种方法。
答案 1 :(得分:10)
不,你将不得不制作自己的留言箱表格。 MessageBox
类仅支持类似于.ShowDialog()
的行为,这是一种模态操作。
只需创建一个带有参数的新表单,然后根据自己的喜好使用这些参数构建样式化的消息框。
更新2014-07-31
本着通过谷歌发现这一点的任何其他人保持清晰的精神,我想花一点时间来解释一下这个:
引擎盖MessageBox
是Windows SDK user32.dll MessageBox Function周围的一个奇特的C#Wrapper,因此行为方式完全相同(将.NET Enums转换为代表系统调用中相同内容的整数。) / p>
这意味着当您致电MessageBox.Show()
时,呼叫将被整理到操作系统,并且阻止当前线程,直到选择了一个选项或窗口被终止。为了防止代码被暂停,您需要在单独的线程上启动消息框,但这意味着从消息框返回的任何结果(是 / 否 / 确定 / 取消 /等等...)将返回到负责调用消息框的单独线程。
如果你按照这种方式启动此消息框的结果,你必须将结果发送回UI Thread for Thread Saftey。
或者,您可以在WinForms / WPF中创建自己的消息框表单,并使用.Show()
方法调用它。按钮上的任何点击事件都将在UI线程上执行,您不必将调用分派回UI线程来操纵UI中的内容。