WPF : Problème de style [Résolu]

Messages postés
44
Date d'inscription
jeudi 8 avril 2004
Dernière intervention
29 mars 2010
- 15 déc. 2009 à 09:02 - Dernière réponse :
Messages postés
44
Date d'inscription
jeudi 8 avril 2004
Dernière intervention
29 mars 2010
- 16 déc. 2009 à 12:00
Bonjour,

Je viens vers vous car j’ai un petit souci sur un projet en WPF.

Ma problématique est la suivante :
J’ai un style appliqué sur plusieurs de mes contrôles (en fait un dégradé du fond de Transparent vers Blanc), jusque là aucuns soucis le style s’applique bien sur tout mes contrôles.

Exemple de style utilisé :

Code :
<Setter Property="Label.Background">
            <Setter.Value>
                <LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
                    <LinearGradientBrush.GradientStops>
                        <GradientStop Color="Transparent" Offset="0.0" />
                        <GradientStop Color="LightGray" Offset="1" />
                    </LinearGradientBrush.GradientStops>
                </LinearGradientBrush>
            </Setter.Value>
        </Setter>

Là où cela se complique, c’est que je ne veux plus que le dégradé soit de Transparent vers Blanc, mais de transparent vers une couleur différente pour chaque contrôle.

En gros, l’idée serait de faire un style qui définit UNIQUEMENT la façon dont va s’afficher le background et non pas ce qui s’affiche dans le background.

Idéalement j’aurais souhaité avoir un truc du genre :
Code :
<MonControle BackGround= "Blue" Style="{StaticResource monStyleDegrade}" />

Donc la grande question serait : est-ce qu’il existe un moyen de « paramétrer » un style ou un template ou faut-il le faire « à la main » via le code ?

Pour résoudre mon problème j’essais d’exploiter cette piste :

Je me créé un contrôle qui hérite d’un Label :
Code :
public class CLabelPerso : Label
    {
        public CLabelPerso()
            : base()
        {
            BackGroundColor = Brushes.Red;
        }

        public Brush BackGroundColor { get; set; }
    }

Et j’essais maintenant de faire le syle correspondant à ce nouveau contrôle qui utiliserais sa propriété BackGroundColor pour déféinir sa couleur de fond.
J’obtiens le style suivant :
Code :
<ResourceDictionary 
[&#8230;]
                    xmlns:local="clr-namespace:WpfSchema">

<Style TargetType="{x:Type local:CLabelPerso}" x:Key="LabelDegradePerso">
<Setter Property="local:CLabelPerso.Background" Value="{Binding Path=local:CLabelPerso.BackGroundColor, RelativeSource={x:Static RelativeSource.Self}}">
        </Setter>
</Style>

Le style étant appliqué lors de la création dynamique de mes labels dans le code behind :
Code :
CLabelPerso lbl = new CLabelPerso();
lbl.BackGroundColor = Brushes.Green;
lbl.Style = (Style)FindResource("LabelDegradePerso");

grid.Children.Add(lbl);

Là mes labels s’affichent bien dans ma grid par contre leurs fonds restent désespérément transparents donc ma syntaxe du mapping de ma propriété doit être incorrecte ou une fois encore je suis à côté de la plaque.
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
6069
Date d'inscription
dimanche 13 avril 2003
Dernière intervention
15 juillet 2011
- 15 déc. 2009 à 13:49
3
Merci
Salut,

Il me semble que tu as oublié un concept de WPF,
les dependencies property

Exemple ici

Cela permet que les propriétés s'abonnent aux différents type d'evenement les modifiants et la propagation de ces derniers vers les controles fils ou parents.

Merci nhervagault 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de nhervagault
Messages postés
44
Date d'inscription
jeudi 8 avril 2004
Dernière intervention
29 mars 2010
- 16 déc. 2009 à 11:13
0
Merci
Tout d'abord merci de ta réponse.
J'ais tenté l'ajout d'une dépendencyPropertydans mon contrôle qui fait référence à ma propriété BackGroundColor.

Dans l'état, ça ne change rien à la façon dont se redessine mes labels.

Le soucis doit toujours venir du fait que je n'arrive pas à dire via le XAML, dans le setter de mon style, que MaLabel.BackGround = MaLabel.BackGroundColor ( vous me direz ça ne sert à rien, mais à partir du moment où j'ai compris comment ça marche comme ça, je peux le faire pour n'importe quoi :))
Commenter la réponse de Philenain1
Messages postés
44
Date d'inscription
jeudi 8 avril 2004
Dernière intervention
29 mars 2010
- 16 déc. 2009 à 12:00
0
Merci
Autant pour moi il suffisant de supprimer la déclaration de la valeur qui était :

<Setter Property="local:CLabelPerso.Background" Value="{Binding Path=local:CLabelPerso.BackGroundColor, RelativeSource={x:Static RelativeSource.Self}}">


en un simple :

<Setter Property="Background" Value="{Binding Path=BackGroundColor, RelativeSource={x:Static RelativeSource.Self}}">


Et le tour était joué.

Encore merci pour le coup de pouce :)
Commenter la réponse de Philenain1

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.