Должен ли я вызывать Application.EnableVisualStyles() в службах терминалов?

#c# #.net #winforms #citrix #terminal-services

#c# #.net #winforms #citrix #terminal-services

Вопрос:

В среде служб терминалов / citrix должен ли я вызывать Application.EnableVisualStyles() в моем приложении .NET 3.5 WinForms при запуске моей программы? Или лучше воздержаться от этого?

Я ищу вариант, который обеспечивает наилучшую производительность, и мне не нужны никакие элементы управления, нарисованные с помощью тем.

Ответ №1:

Визуальные стили — это цвета, шрифты и другие визуальные элементы, которые формируют тему операционной системы. Элементы управления будут отображаться с использованием визуальных стилей, если элемент управления и операционная система поддерживают это. Чтобы добиться эффекта, перед созданием каких-либо элементов управления в приложении необходимо вызвать EnableVisualStyles(); обычно EnableVisualStyles() — это первая строка в основной функции.

Итак, если вам нужно, чтобы ваше приложение выглядело в соответствии с текущей темой операционной системы, вам нужно вызвать это. Если вам достаточно классического вида Windows, вы можете пропустить это. Лично я никогда не включаю визуальные стили для своих приложений, предназначенных только для сервера (например, панелей управления и т.д.).

Ниже приведен инструмент конфигуратора без включенных визуальных стилей. Это хорошо выглядит для меня таким образом, так что EnableVisualStyles было пропущено:

введите описание изображения здесь

Краткий обзор Application.EnableVisualStyles() метода с reflector показан ниже кода в методе EnableVisualStyles -> EnableVisualStylesInternal -> CreateActivationContext :

 if (!contextCreationSucceeded amp;amp; 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 это абсолютно не влияет, поэтому вызывать его или нет, не имеет значения.

Комментарии:

1. Да, но на рассматриваемом сервере терминалов, вероятно, будут отключены темы операционной системы (он будет использовать «классический» вид), чтобы сэкономить ресурсы. Таким образом, мой вопрос заключается в том, вызываю ли я приложение. EnableVisualStyles () будет иметь какое-либо значение в этом параметре с точки зрения производительности. Для клиентов, запускающих приложение вне служб терминалов, я буду вызывать EnableVisualStyles().

2. Нет приложения. EnableVisualStyles () будет эффективен только в том случае, если включены тематические службы ОС и поддержка тем, поэтому вызов EnableVisualStyles или нет вообще не окажет никакого эффекта (ни с точки зрения производительности, ни с точки зрения визуальных эффектов), если темы уже отключены.