Неверные значения 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 Исправил / обошел проблему с принтером сейчас, но хочу понять, с чем я столкнулся...

0 ответов

Другие вопросы по тегам