2009-12-15 69 views
0

我正在创建一个应用程序,该应用程序有一个RichTextBox,它具有基于信息表示的不同颜色的文本(红色表示错误,黑色表示标准消息等)。我试图支持Windows主题,以及系统颜色的可能变化。为此,我创建了一种基于Window系统颜色更改默认文本颜色的方法,通过使每种颜色变得更亮或更暗,使其对比良好。更改主题后Windows窗体应用程序退出

但是,在测试此系统时,我发现如果在程序运行时更改主题,它会默默退出,没有任何解释甚至是异常。它只是退出。我尝试在Application.Run调用后放置一个断点,并且在浏览器修改主题时,Windows会挂起“Please wait ...”屏幕。一分钟后,屏幕消失了,果然,断点已经被击中,这意味着它不会彻底杀死这个过程。

我的问题是,为什么它这样做,有没有办法阻止它这样做?

谢谢。

回答

2

调试这个更好的方法是将FormClosing事件处理程序添加到您的窗体并在其上设置一个断点。当它中断时,callstack会显示哪些代码正在调用Close()方法。

您正在使用SystemEvents.UserPreferenceChanged事件的一种典型故障模式是在表单关闭时忘记注销您的事件处理程序。这是一个静态事件,它会阻止连接事件的表单被垃圾收集。当事件触发时,你很可能会得到一个ObjectDisposedException。但这只是一个猜测。

+0

呸!你是对的,在FormClosing事件中设置断点确实有帮助。看起来这是在执行'WndProc'覆盖时调用'Application.Exit()'。我拥有它,所以如果壁纸发生变化,应用程序将退出。我通常只在其中一个配置中设置了编译符号,但不知怎的,它以我的调试配置结束。不要问为什么我在壁纸变化时关闭它,这太复杂了......非常感谢! – mgbowen 2009-12-15 02:26:27

0

很长时间以来,ASP.NET开始做winform的时候,令人惊讶的是,它只是在没有任何词语的情况下吃了一些例外。您必须将Application.Run(新的MDIParent1())包装在try catch块中。

另外,你有:

Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false);