Неверные значения Application.VisualStyleState
У меня есть приложение на основе winforms, которое использует элементы управления Infragistics (v10.3 от 2010 года), и после установки нового драйвера принтера мы начали видеть множество проблем, связанных со свойством VisualStyleState приложения. В частности, мы видим проблемы, упомянутые здесь и здесь.
После некоторых копаний кажется, что драйвер принтера устанавливает приложение VisualStyleState = 7, которое в.NET выглядит как недопустимое значение, но в соответствии с WinAPI это не...
В.NET перечисление VisualStyleState определяется следующим образом: (обратите внимание на отсутствие атрибута 'Flags' и ручного ввода для комбинации '1' | '2')
public enum VisualStyleState {
/// Visual styles are not enabled.
NoneEnabled = 0,
/// Visual styles enabled only for client area.
ClientAreaEnabled = NativeMethods.STAP_ALLOW_CONTROLS,
/// Visual styles enabled only for non-client area.
NonClientAreaEnabled = NativeMethods.STAP_ALLOW_NONCLIENT,
/// Visual styles enabled only for client and non-client areas.
ClientAndNonClientAreasEnabled = NativeMethods.STAP_ALLOW_NONCLIENT | NativeMethods.STAP_ALLOW_CONTROLS
}
С константами NativeMethods, определенными как: (И здесь мы видим, что 7 - это 'или' из всех возможных значений)
// Theming/Visual Styles stuff
public const int STAP_ALLOW_NONCLIENT = (1 << 0);
public const int STAP_ALLOW_CONTROLS = (1 << 1);
public const int STAP_ALLOW_WEBCONTENT = (1 << 2);
В свойстве Application.VisualStyleState установщик специально запрещает значения> 3 (STAP_ALLOW_NONCLIENT | STAP_ALLOW_CONTROLS). Он вернет значения> 3 через геттер, так как он просто вслепую передает значение обратно, но его можно больше согласовать с перечислением VisualStyleState...
public static VisualStyleState VisualStyleState
{
get
{
if (!VisualStyleInformation.IsSupportedByOS)
{
return VisualStyleState.NoneEnabled;
}
VisualStyleState vState = (VisualStyleState) SafeNativeMethods.GetThemeAppProperties();
return vState;
}
set
{
if (VisualStyleInformation.IsSupportedByOS)
{
if (!ClientUtils.IsEnumValid(value, (int)value, (int)VisualStyleState.NoneEnabled, (int)VisualStyleState.ClientAndNonClientAreasEnabled))
{
throw new InvalidEnumArgumentException("value", (int)value, typeof(VisualStyleState));
}
SafeNativeMethods.SetThemeAppProperties((int)value);
//248887 we need to send a WM_THEMECHANGED to the top level windows of this application.
//We do it this way to ensure that we get all top level windows -- whether we created them or not.
SafeNativeMethods.EnumThreadWindowsCallback callback = new SafeNativeMethods.EnumThreadWindowsCallback(Application.SendThemeChanged);
SafeNativeMethods.EnumWindows(callback, IntPtr.Zero);
GC.KeepAlive(callback);
}
}
}
Конечно, значение STAP_ALLOW_WEBCONTENT может быть неприменимо к настольным приложениям winforms (я немного не уверен относительно того, на что это значение действительно влияет), но согласно документации uxtheme.dll для SetThemeAppProperties и GetThemeAppProperties я должен иметь возможность передавать и получать битовую маску / флаг /'логические или' значения.
(Обход Application.VisualStyleState и вызов функций самостоятельно позволяет установить значения> 3, но библиотеки, такие как Infragistics, очевидно, используют встроенное свойство для таких целей)
Есть ли конкретная причина, по которой это было реализовано таким образом? или я что-то упустил?
PS Исправил / обошел проблему с принтером сейчас, но хочу понять, с чем я столкнулся...