IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Définition d'une allure par défaut pour la fenêtre


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 105
    Points : 58
    Points
    58
    Par défaut Définition d'une allure par défaut pour la fenêtre
    Bonjour,
    J'ai mis dans mon fichier App.xaml toute le définition de l'apparence des différents éléments de mon application et j'ai 2 questions :
    La mise en forme marche pour tout mais pas pour la fenêtre que j'ai définit de cette façon pourquoi et surtout comment faire:
    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            <Style TargetType="{x:Type Window}">
                <Setter Property="Background" Value="{DynamicResource DegradeFenetre}"/>
                <Setter Property="Icon" Value="Images/icone.ico"/>
                <Setter Property="Title" Value="MonAppli"/>
                <Setter Property="BorderBrush" Value="{DynamicResource BrushNoire}"/>
                <Setter Property="Foreground" Value="{DynamicResource BrushCouleur4}"/>
                <Setter Property="WindowStyle" Value="None"/>
                <Setter Property="ResizeMode" Value="NoResize"/>
            </Style>

    Est il possible de créer un modèle qui s'applique à tous les Boutons, et un autre basé dessus qui ne s'applique qu'à certains (ceux qui le référence). Si je met un x:key à mon modèle par défaut il ne s'applique plus qu'aux éléments qui le référencent. Si je ne lui mets pas de x:key je ne sais pas comment mon sous modèle peut le référencer avec le BasedOn comme étant le modèle de base.

    Merci d'avance

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il est possible de définir un style par défaut sans préciser de x:key
    celui s'appliquera à tous les controles du targettype spécifié
    il est possible de faire plusieurs styles par control, un seul peut etre par défaut, les autres doivent avoir un x:key
    il est possible de faire de l'héritage de style avec BasedOn pour n'écrire que ce qui est différent du style de base par exemple
    pour le BasedOn sur un style par défaut n'ayant pas de x:key je pense qu'il faut faire BasedOn="{StaticResource {x:Type Button}}" (pas testé récemment)

    pour appliquer un style qui a un x:key (donc pas par défaut) à la place de celui par défaut il faudra écrire Style="{StaticResource nomdustyle}" sur l'instance en question
    (l'intellisense propose les styles applicables pour le type après avoir écrit staticresource)

    Window et Usercontrol ne peuvent avoir de style par défaut appliqué
    ceci est du au fait que quand on fait un window ou un usercontrol on hérite de la classe window ou usercontrol via une nouvelle classe, et le style par défaut est lié au type window/usercontrol donc il ne s'applique pas par exemple à MainWindow qui est un type en plus du nom du fichier
    il faudra donc faire un style avec un x:key et l'appliquer à chaque
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 105
    Points : 58
    Points
    58
    Par défaut
    Merci pour votre réponse. Malheureusement la syntaxe BasedOn="{StaticResource {x:Type Button}}" ne marche pas. Je continue de chercher.
    EDIT : Pardon ça marche j'avais du faire une faute de frappe.
    Pour le reste c'est clair maintenant.


    J'en profite pour une question sous jacente, je ne comprends pas la différence entre TargetType="Button" et TargetType="{x:Type Button}".

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    je viens de tester c'est bien BasedOn="{StaticResource ResourceKey={x:Type Button}}"


    concernant le TargetType c'est une propriété de type System.Type
    donc soit on donne le type en tant que type via x:Type soit comme souvent en XAML il y a une classe dans le Framework wpf qui s'occupe de prendre un string en entrée et de le transformer pour le type voulu
    comme quand on dit Background="Red", background est de type Brush, mais il y a une classe qui lit red et qui transforme ca en solidcolorbrush donc ca passe

    donc TargetType="Button" équivaut à TargetType="{x:Type Button}"

    on trouve pas mal de x:type ici car il me semble qu'au début de wpf pour avoir un style par défaut il fallait faire x:key="{x:Type Button}" car key était obligatoire
    ils ont du garder la syntaxe que je suppose venir de Xamarin qui permet de ne pas spécifier de key et que le style soit appliqué par défaut
    sachant qu'un contrôle pour trouver son style par défaut va demander la resource ayant comme clé son type justement, une clé de resources étant As object un type peut faire office de clé
    en ne spécifiant que targettype la clé doit implicitement être le type de la classe, ce qui correspondrait à l'ancienne syntaxe qui fonctionne encore
    et qui explique bien que pour le basedon on cherche une resource donc la clé est le type
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 105
    Points : 58
    Points
    58
    Par défaut
    Pour moi les 2 syntaxes marchent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BasedOn="{StaticResource ResourceKey={x:Type Button}}"
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BasedOn="{StaticResource {x:Type Button}}"
    Merci pour les explications.

  6. #6
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 896
    Points : 1 912
    Points
    1 912
    Par défaut
    Citation Envoyé par knarf44 Voir le message
    Pour moi les 2 syntaxes marchent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BasedOn="{StaticResource ResourceKey={x:Type Button}}"
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BasedOn="{StaticResource {x:Type Button}}"
    Merci pour les explications.
    Les deux syntaxes aboutissent au même résultat mais par des procédures différentes. Dans un fichier xaml tous les éléments spécifiés dans les {} en valeurs de propriétés correspondent dans le framework à une classe héritant de MarkupExtension. Par exemple pour StaticResource il y a la classe StaticResourceExtension. Le parser xaml va analyser le fichier et instancier les classes qu'il va reconnaître par convention. Ensuite ça dépend de la façon dont est renseignée l'extension de balise.

    Dans le premier cas par exemple (avec l'attribut ResourceKey) il y aura d'abord l'appel au constructeur par défaut (sans paramètre) de l'extension puis un appel au setter de la propriété. Dans le second cas ce sera un appel au constructeur paramétré, prenant en argument la valeur qui devra être affectée à la propriété. Toutes les extensions n'ont pas ce constructeur paramétré mais lorsqu'il est disponible il permet de ne pas mentionner la propriété présentement associée au constructeur afin d'alléger le code. À noter que ce comportement est similaire à celui des balises xaml elles-mêmes concernant les classes associées lorsque l'on choisit de spécifier des données dans un attribut ou directement à l'intérieur de la balise.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] VBA: Définir une valeur par défaut pour un range d'activeX combobox
    Par redhotchilipeppers dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/07/2014, 20h22
  2. Définir une valeur par défaut pour un champ many2one ?
    Par jmbinformatique dans le forum Odoo (ex-OpenERP)
    Réponses: 1
    Dernier message: 14/02/2014, 10h42
  3. Réponses: 0
    Dernier message: 07/10/2010, 20h11
  4. Réponses: 3
    Dernier message: 22/08/2010, 17h40
  5. [JAXB]Comment faire apparaitre dans le xsd une valeur par défaut pour un attribut
    Par Marcos Ickx dans le forum Persistance des données
    Réponses: 0
    Dernier message: 07/01/2010, 18h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo