Application.EnableVisualStyles 错误






4.92/5 (37投票s)
2003年10月26日
2分钟阅读

228404
调用 Application.EnableVisualStyles 会阻止来自 ImageList 的图像在 Windows 通用控件上显示
引言
.NET framework 1.1 版本引入了方法 System.Windows.Forms.Application.EnableVisualStyles
。 在创建任何窗体或控件之前调用此方法,将导致 Windows XP 在渲染 Windows 通用控件和许多本机 .NET 控件(如按钮和复选框)时应用主题。
使用 .NET 1.0、MFC、WTL 或 VB6 时,需要包含一个清单文件,要么与可执行文件位于同一目录中,要么编译到其中作为资源,才能使用 Windows XP 视觉样式。 虽然这并不难,但为创建的每个可执行文件提供清单文件很繁琐,而且 Visual Studio 对帮助您执行此操作的支持非常有限。
将 EnableVisualStyles
引入到框架的 v1.1 版本是一个不错的补充,因为它允许 WinForms 应用程序轻松采用 Windows XP 样式的全新外观和感觉。
该错误
问题在于 EnableVisualStyles
的实现中存在一个错误,该错误会干扰存储在 ImageList
组件中的 Images
以及 Windows 通用控件,例如 TreeView
或 Toolbar
类。 结果是,如果您调用 EnableVisualStyles
,所有图像都将从您的工具栏、树形视图和列表视图中消失。
重现错误
- 在 VS.NET 2003 中创建一个 WinForms 应用程序
- 将
Toolbar
和ImageList
添加到Form1
- 将图像添加到
ImageList
并将按钮添加到Toolbar
- 将图像分配给按钮
- 在
Main
方法中,在调用Application.Run
之前添加对Application.EnableVisualStyles
的调用
当您在 Windows XP 上运行该应用程序时,并且启用了视觉样式,工具栏按钮上将不会显示任何图像。
解决方法
在 搜索 Google 群组 之后,我发现了一些关于此问题的讨论以及一个似乎有效的解决方法,并且没有在我的应用程序中引起任何问题。(要了解有关该解决方法的更多信息,请访问 此处)
在 EnableVisualStyles
之后调用 Application.DoEvents
,似乎可以解决问题。 它是如何或为什么工作的,谁知道呢。 很可能它会导致通过 PostMessage
发送的一些消息被刷新到正确的位置,然后再创建第一个基于 WinForms 的窗口。
因此,解决方法代码如下所示
void Main()
{
Application.EnableVisualStyles();
Application.DoEvents();
Application.Run(new Form1());
}
到目前为止,我还没有看到该解决方法产生任何不良影响,并且它似乎始终有效。