You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何MessageBox.Show在屏幕底部附近会显示空白消息?

问题:GalleryControl的OnPaint异常排查时,底部MessageBox显示空白

我在XAF属性编辑器的用户控件中,为GalleryControl编写了如下代码,用来排查OnPaint方法偶尔出现的故障。但发现当MessageBox出现在屏幕底部附近时,消息内容会显示空白。

using DevExpress.XtraBars.Ribbon;
using DevExpress.XtraBars.Ribbon.Gallery;
using System;
using System.Windows.Forms;

namespace MyApp.Module.Win.Features.Jama.Editors.ThinWorkflow
{
    public class MyGalleryControl : GalleryControl
    {
        protected override GalleryControlGallery CreateGallery() { return new myGallery(this); }

        protected override void OnPaint(PaintEventArgs args)
        {
            try
            {
                base.OnPaint(args);
            } catch(Exception ex)
            {
                MessageBox.Show($"In OnPaint:inner {ex.InnerException} :full:{ex.Message}", "MyGalleryControl:OnPaint");
                // throw new Exception("In OnPaint");
            }
        }
    }
}

OnPaint异常时的空白MessageBox

解决建议

  • 不要在OnPaint事件中弹出MessageBox:OnPaint是UI绘制线程的核心流程,弹窗会打断绘制逻辑,甚至引发重入问题,这大概率是消息空白的诱因。推荐改用日志记录异常,比如用System.Diagnostics.Trace.WriteLine将异常信息输出到调试窗口,或者用NLog、Serilog等库写入日志文件,这样既不干扰UI绘制,也能完整保留异常信息。
  • 若必须弹窗,强制指定显示位置:使用MessageBox的重载方法,手动设置弹窗的位置,避免它出现在屏幕边缘。例如:
    var msgBoxPos = new Point(100, 100); // 设置固定位置
    MessageBox.Show(this, $"In OnPaint:inner {ex.InnerException?.Message ?? "无"} :full:{ex.Message}", "MyGalleryControl:OnPaint", 
                    MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, 
                    0, msgBoxPos);
    
  • 优化异常信息拼接:当ex.InnerException为null时,直接拼接会显示"null",可以用ex.InnerException?.Message ?? "无"来优化信息可读性。

内容的提问来源于stack exchange,提问作者Kirsten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:35:26