Votre application XAML/UWP plante en mode haut contraste!

Ne nombreuses applications du store plantent méchamment dès que l’on passe son PC en mode haut contraste.

Le problème vient souvent d’un code proche de celui qui suit :

<ResourceDictionary.ThemeDictionaries>
    <ResourceDictionary x:Key="Light">
        <SolidColorBrush x:Key="PageContainerBackground" Color="#FFE6E6E6" />
        <Style x:Key="PathLogoStyle" TargetType="Path">
            <Setter Property="Fill">
                <Setter.Value>
                    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                        <LinearGradientBrush.GradientStops>
                            <GradientStop Offset="0" Color="{Binding Theme.MyLightColor2,Source={StaticResource ThemeViewModel}}"/>
                            <GradientStop Offset="1" Color="{Binding Theme.MyLightColor,Source={StaticResource ThemeViewModel}}"/>
                        </LinearGradientBrush.GradientStops>
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
            <Setter Property="Stroke">
                <Setter.Value>
                    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                        <LinearGradientBrush.GradientStops>
                            <GradientStop Color="#FF0F0F0F" Offset="0" />
                            <GradientStop Offset="1" Color="{Binding Theme.MyLightColor,Source={StaticResource ThemeViewModel}}"/>
                        </LinearGradientBrush.GradientStops>
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>
    <ResourceDictionary x:Key="Dark">
        <SolidColorBrush x:Key="PageContainerBackground" Color="#FF0F0F0F" />
        <Style x:Key="PathLogoStyle" TargetType="Path">
            <Setter Property="Fill">
                <Setter.Value>
                    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                        <LinearGradientBrush.GradientStops>
                            <GradientStop Offset="0" Color="{Binding Theme.MyLightColor2,Source={StaticResource ThemeViewModel}}"/>
                            <GradientStop Offset="1" Color="{Binding Theme.MyLightColor,Source={StaticResource ThemeViewModel}}"/>
                        </LinearGradientBrush.GradientStops>
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
            <Setter Property="Stroke">
                <Setter.Value>
                    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                        <LinearGradientBrush.GradientStops>
                            <GradientStop Color="#FF0F0F0F" Offset="0" />
                            <GradientStop Offset="1" Color="{Binding Theme.MyLightColor,Source={StaticResource ThemeViewModel}}"/>
                        </LinearGradientBrush.GradientStops>
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>

Pas facile de voir l’erreur quand on a le nez sur son code… Pourtant, celle-ci est grossière.

Le dictionnaire de ressource n’inclut pas de variante pour le haut contraste. Les ressources spécifiques qui ont été créées pour les thème Light et Dark, n’existent donc pas quand le thème haut contrat est actif.

Une solution simplette et propre peut donc revenir à ajouter ceci :

<ResourceDictionary x:Key="HighContrast">
    <SolidColorBrush x:Key="PageContainerBackground" Color="#FF0F0F0F" />
    <Style x:Key="PathLogoStyle" TargetType="Path">
        <Setter Property="Visibility" Value="Collapsed" />
    </Style>
</ResourceDictionary>

Au passage, on peut même en profiter pour masquer des contenus inappropriés pour les personnes qui ont besoin de ce mode.

Jérémy Jeanson

Comments

You have to be logged in to comment this post.