为何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是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
相关产品推荐
相关产品推荐

