窗体应用程序中的消息框未显示,C#。

4
当我尝试启动一个消息框(通常是为了通知异常,但我也尝试过从表单中启动一个消息框),程序似乎会停顿,我无法点击除关闭之外的任何东西,但必须从Visual Studio窗口中关闭它。
我已经缩小了问题范围,发现与pictureBox1_paint事件处理程序有关,当我删除这段代码时,消息框就可以再次出现。下面是相关代码:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    using (Pen pen = new Pen(Color.Black, 1))
    {
        e.Graphics.DrawRectangle(pen, mRect);
    }
    pictureBox1.Invalidate();
}

调用堆栈显示它正在某些外部代码上,当展开时,对我来说似乎它正在将消息框“绘制”到屏幕上,但似乎被某些东西所阻塞?如果程序暂停,它显示下一行要执行的是从它正在做的任何事情返回的示例如下:
private void button2_Click(object sender, EventArgs e)
{
    if (GlobalPlot != null)
    {
        resize = ExpandToBound(GlobalPlot.Size, pictureBox1.Size);
    }
    else return;

    try
    {
        PlotPixel(resize);

    }
    catch (System.ArgumentOutOfRangeException index)
    {
        //this is the next line to execute:
        MessageBox.Show(index.Message,"Exception",MessageBoxButtons.OK);
        return;
    }
}

不太确定发生了什么事情,但非常感谢您的帮助,谢谢。


try catch语句可以位于第一个if语句内,即在resize = ...语句之后,这样您就不需要使用丑陋的return语句。实际上,在MessageBox.Show之后您也不需要它。 - GuidoG
3个回答

6

因为这是与该主题相关的最受关注的问题,所以这里提供一个真正可行的解决方案。只需像下面这样填写所有MessageBox参数即可: MessageBox.Show(index.Message, "异常", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);


3
可以的,它确实有效。但是背后的原因是什么?你能否解释一下? - karthik
1
我相信DefaultDesktopOnly选项是解决这个问题的方法。其他参数是必需的,因为没有包括MessageBoxOptions参数的更短的重载。 - cwohlman

1

消息框会出现在你的窗体下面,你看不到它。尝试这样做:

MessageBox.Show(this, index.Message,"Exception",MessageBoxButtons.OK);

当消息框出现时,它可能会覆盖图片,导致它触发绘制事件。在绘制事件中调用了Invalidate()方法,这会再次触发绘制事件,从而又会调用Invalidate()方法,这样循环下去会导致窗体看起来像是被冻结了。
请移除绘制事件中的Invalidate()方法。

在Paint事件中,pictureBox1.Invalidate(); 真的必要吗? - GuidoG
1
@JoeFletcher 在你的绘制方法中使用 Invalidate 不会导致 Paint 事件再次被调用吗?从而又会使 Invalidate 再次被调用,Paint 再次被调用,如此循环... 导致 MessageBox.Show() 和其他任何方法都必须等待,使你的窗体看起来像是冻结了。 - GuidoG
啊,多么简单的错误,我想已经解决了。非常感谢。我一直在想需要调用什么来确保矩形被渲染,现在看起来很明显了。 - Mojojojo
没问题。如果这个答案解决了您的问题,请考虑点赞和/或接受答案。谢谢。 - GuidoG

1
我是一名有用的助手,可以为您进行翻译。以下是需要翻译的内容:

我遇到了同样的问题,但通过从表单中调用消息框来解决它:

不要调用

System.Windows.MessageBox.Show("test","test");

呼叫

System.Windows.Forms.MessageBox.Show("test","test");

希望这能帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接