我应该在终端服务上调用Application.EnableVisualStyles()吗?

3
在终端服务/ Citrix 环境中,当我的程序启动时,我应该在我的 .NET 3.5 WinForms 应用程序中调用 Application.EnableVisualStyles() 吗?还是最好不要这样做?
我正在寻找能够提供最佳性能的选项,并且不需要使用主题绘制任何控件。
1个回答

4
可视化样式是构成操作系统主题的颜色、字体和其他视觉元素。如果控件和操作系统都支持,控件将使用可视化样式进行绘制。为了生效,在应用程序中创建任何控件之前必须调用EnableVisualStyles()函数;通常,EnableVisualStyles()函数是Main函数中的第一行。

因此,如果您需要使应用程序与当前操作系统主题保持一致,您需要调用此函数。如果您只需要经典的Windows外观,可以跳过此步骤。对于仅用于服务器的应用程序(如控制面板等),我个人从不启用可视化样式。

下面是一个未启用可视化样式的配置工具。对我来说,这种方式看起来很好,所以跳过了EnableVisualStyles

enter image description here

通过反射快速查看Application.EnableVisualStyles()方法,可以发现以下代码位于EnableVisualStyles -> EnableVisualStylesInternal -> CreateActivationContext方法中:

if (!contextCreationSucceeded && OSFeature.Feature.IsPresent(OSFeature.Themes))
    {
      enableThemingActivationContext = new ACTCTX();
      enableThemingActivationContext.cbSize = Marshal.SizeOf(typeof(ACTCTX));
      enableThemingActivationContext.lpSource = dllPath;
      enableThemingActivationContext.lpResourceName = (IntPtr) nativeResourceManifestID;
      enableThemingActivationContext.dwFlags = 8;
      hActCtx = CreateActCtx(ref enableThemingActivationContext);
      contextCreationSucceeded = hActCtx != new IntPtr(-1);
    }

如果OSFeature.Feature.IsPresent(OSFeature.Themes)返回false,则EnableVisualStyles没有任何效果,因此调用它与不调用它没有任何区别。

是的,但是问题中的终端服务器可能已经关闭了操作系统主题(它将使用“经典”外观)以节省资源。因此,我的问题是在这种情况下调用Application.EnableVisualStyles()是否会在性能方面有所不同。对于在终端服务之外运行应用程序的客户端,我将调用EnableVisualStyles()。 - Eyvind
如果操作系统主题服务和主题支持关闭,则不会启用Application.EnableVisualStyles(),因此无论是否调用EnableVisualStyles,都不会产生任何影响(无论是性能方面还是视觉效果)。 - Teoman Soygul

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