none
XAML : LinearGradientBrush RRS feed

  • Question

  • Bonjour,

    J'utilise VS Community, dernière mise à jour (15.9.3), dans une solution WPF.

    Je veux réaliser le DictionrayResource suivant mais VS indique des erreurs dont je ne comprends pas la raison.

    Il souligne les premières lignes GradientStop et indique LinearGradientBrush ne prends pas en compte le contenu direct.

    Je suis pourtant, il me semble, conforme aux exemples fournis dans la doc 

    Par ailleurs, dans la suite (voir plus loin) le x:Type Button n'est pas trouvé

    Il manque surement quelque chose, une déclaration ?

    Pouvez-vous me dire où se trouve ces erreurs et comment les corriger ?

    Merci à vous.

    <ResourceDictionary 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        >
    
        <!-- TabItem CloseButton Brush : Repos et Over-->
        <SolidColorBrush x:Key="TabCloseButtonBrush" Color="#FF000000"/>
    
        <!-- Couleurs Normales des TabItems-->
        <SolidColorBrush Color="#FFF0F0F0" x:Key="StartRouge" />
        <SolidColorBrush Color="#FFC54444" x:Key="StopRouge" />
    
        
        <LinearGradientBrush x:Key="TabItemRouge" StartPoint="0,0" EndPoint="0,1">
            <GradientStop Color="StartRouge" Offset="0"/>
            <GradientStop Color="StopRouge" Offset="1"/>
        </LinearGradientBrush>
    
        <LinearGradientBrush x:Key="TabItemVerte" StartPoint="0,0" EndPoint="0,1">
            <GradientStop Color="#FFF0F0F0" Offset="0"/>
            <GradientStop Color="#FF298853" Offset="1"/>
        </LinearGradientBrush>
    
    

    Et pour les x:Type Button :

        <Style x:Key="CloseButtonStyle" TargetType="{x:Type Button}">
            <Setter Property="BorderBrush" Value="Transparent"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="Template">
    


    Alain

    lundi 3 décembre 2018 14:06

Réponses

  • Tout d'abord dans votre fichier de dictionnaire de ressource, il faut corriger quelque chose :

    <!--  TabItem CloseButton Brush : Repos et Over  -->
        <SolidColorBrush x:Key="TabCloseButtonBrush" Color="#FF000000" />
    
        <!--  Couleurs Normales des TabItems  -->
        <SolidColorBrush x:Key="StartRouge" Color="#FFF0F0F0" />
        <SolidColorBrush x:Key="StopRouge" Color="#FFC54444" />
    
        <LinearGradientBrush x:Key="TabItemRouge" StartPoint="0,0" EndPoint="0,1">
            <GradientStop Offset="0" Color="{Binding Source={StaticResource StartRouge}, Path=Color}" />
            <GradientStop Offset="1" Color="{Binding Source={StaticResource StopRouge}, Path=Color}" />
        </LinearGradientBrush>
    
        <LinearGradientBrush x:Key="TabItemVerte" StartPoint="0,0" EndPoint="0,1">
            <GradientStop Offset="0" Color="#FFF0F0F0" />
            <GradientStop Offset="1" Color="#FF298853" />
        </LinearGradientBrush>

    En effet, vous essayer d'attribuer une couleur de ressource directement dans une chaine de caractère pour vos dégradés. Passez par une ressource de type Color, ou utilisez la syntaxe Binding comme dans mon code ci-dessus. 

    Ensuite quand vous dite "projet de bibliothèque C#", est-ce un projet de bibliothèque .NET framework simple ou une bibliothèque WPF ? Si c'est une simple bibliothèque .NET framework ajoutez les références suivantes :

    • WindowsBase
    • PresentationCore
    • PresentationFramework
    • System.Xaml

    Cordialement,

    • Marqué comme réponse AchLog mercredi 5 décembre 2018 20:08
    lundi 3 décembre 2018 15:55

Toutes les réponses

  • Bonjour AchLog,

    Régénérez la solution avec Visual Studio, c'est peut être tout simplement un bug de l'interpréteur XAML de Visual Studio.

    Cordialement,

    lundi 3 décembre 2018 14:11
  • Merci beaucoup Arthur pour votre réponse rapide mais, hélas non, il ne s'agit pas de cela. J'ai bien évidemment essayé.

    Le problèmes est apparu lors de l'intégration de ce fichier de ressources dans un projet de librairy C# de la solution. Il doit manquer des références à des assembly dans celui-ci mais lesquelles ?

    Cordialement


    Alain

    lundi 3 décembre 2018 15:14
  • Tout d'abord dans votre fichier de dictionnaire de ressource, il faut corriger quelque chose :

    <!--  TabItem CloseButton Brush : Repos et Over  -->
        <SolidColorBrush x:Key="TabCloseButtonBrush" Color="#FF000000" />
    
        <!--  Couleurs Normales des TabItems  -->
        <SolidColorBrush x:Key="StartRouge" Color="#FFF0F0F0" />
        <SolidColorBrush x:Key="StopRouge" Color="#FFC54444" />
    
        <LinearGradientBrush x:Key="TabItemRouge" StartPoint="0,0" EndPoint="0,1">
            <GradientStop Offset="0" Color="{Binding Source={StaticResource StartRouge}, Path=Color}" />
            <GradientStop Offset="1" Color="{Binding Source={StaticResource StopRouge}, Path=Color}" />
        </LinearGradientBrush>
    
        <LinearGradientBrush x:Key="TabItemVerte" StartPoint="0,0" EndPoint="0,1">
            <GradientStop Offset="0" Color="#FFF0F0F0" />
            <GradientStop Offset="1" Color="#FF298853" />
        </LinearGradientBrush>

    En effet, vous essayer d'attribuer une couleur de ressource directement dans une chaine de caractère pour vos dégradés. Passez par une ressource de type Color, ou utilisez la syntaxe Binding comme dans mon code ci-dessus. 

    Ensuite quand vous dite "projet de bibliothèque C#", est-ce un projet de bibliothèque .NET framework simple ou une bibliothèque WPF ? Si c'est une simple bibliothèque .NET framework ajoutez les références suivantes :

    • WindowsBase
    • PresentationCore
    • PresentationFramework
    • System.Xaml

    Cordialement,

    • Marqué comme réponse AchLog mercredi 5 décembre 2018 20:08
    lundi 3 décembre 2018 15:55
  • Oui, Merci Arthur,

    En effet il manquait seulement System.Xaml. Maintenant il n'y a plus d'erreur sur la ressource.

    Mais j'ai un autre "petit" problème qui concerne la réalisation d'un assembly C# qui fournit une adaptation du TabItem d'un TabControl et dont la ressource ci-dessus décrit la présentation et le fonctionnement.

    Je me permettrai de reprendre cette conversation à ce sujet demain si vous le voulez bien.

    Bonne soirée.


    Alain


    • Modifié AchLog lundi 3 décembre 2018 19:46
    lundi 3 décembre 2018 19:45
  • Bonsoir,

    Comme indiqué hier, voici une question en complément de cette réponse.

    Ma solution WPF comporte plusieurs projets. L'un d'eux est une Bibliothèque de contrôles personnalisés WPF en C#, de namespace ControlsPixi. Il comporte plusieurs fichiers de classes .cs et une fichier Generic.xaml localisé dans un répertoire Thèmes dont le début est fournit ci-dessous.

    <ResourceDictionary
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ControlsPixi">
    
        <!-- TabItem CloseButton Brush : Repos et Over-->
        <SolidColorBrush x:Key="TabCloseButtonBrush" Color="#FF000000"/>
    
        <!-- Couleurs Normales des TabItems-->
        <LinearGradientBrush x:Key="TabItemRouge" EndPoint="0,1" StartPoint="0,0">
            <GradientStop Color="#FFF0F0F0" Offset="0"/>
            <GradientStop Color="#FFC54444" Offset="1"/>
        </LinearGradientBrush>
    
    



    Dans ces conditions, comment depuis le code C# de l'une des classes accéder aux éléments de style, par exemple TabItemRouge contenus dans ce fichier de ressource ?

    L'extrait de code ci-dessous ne fonctionne pas. L'accès aux ressources rend une valeur nul.

            private CouleurSérie.ColorSerie _Couleur = CouleurSérie.ColorSerie.Noire;
            public CouleurSérie.ColorSerie Couleur
            {
                get { return _Couleur; }
                set
                {
                    LinearGradientBrush  brush;
                    switch (value)
                    {
                        case CouleurSérie.ColorSerie.Rouge:
                            brush = (LinearGradientBrush)Resources["TabItemRouge"];
                            break;
                        case CouleurSérie.ColorSerie.Verte:
                            brush = (LinearGradientBrush)Resources["TabItemVerte"];
                            break;
    

    Merci de votre aide.

    Cordialement


    Alain

    mardi 4 décembre 2018 20:54