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ébutant] Problème compréhension code XAML


Sujet :

Windows Presentation Foundation

  1. #1
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut [Débutant] Problème compréhension code XAML
    Bonjour,

    J'ai écrit dans le fichier generic.xaml le code suivant qui marche, pour ajouter un menu déroulant à mon custom control TabControl2 (ouais, je sais, le nom... Mais j'expérimente simplement), dérivé de TabControl :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        <ContextMenu x:Key="TabContextMenu">
            <MenuItem Header="Context menu"/>
        </ContextMenu>
     
        <Style TargetType="{x:Type local:TabControl2}" BasedOn="{StaticResource {x:Type TabControl}}">
            <Setter Property="TabPanel.ContextMenu"  Value="{StaticResource TabContextMenu}" />
        </Style>

    Et ça marche. Quel est le problème alors ? C'est qu'avant d'en arriver là, j'avais fait l'essai suivant :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        <Style TargetType="{x:Type local:TabControl2}" BasedOn="{StaticResource {x:Type TabControl}}">
            <Setter Property="TabPanel.ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                        <MenuItem Header="Context menu bis"/>
                    </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>

    A ce que j'ai cru comprendre au XAML, ce code devrait être équivalent au premier (mais mieux, car évitant de polluer le dictionnaire avec une information privée). Or s'il compile, il plante à l'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Impossible d'ajouter un contenu de type 'System.Windows.Controls.ContextMenu' à un objet de type 'System.Object'.
    Quelqu'un pourrait-il m'expliquer la différence profonde entre ces deux bouts de code ?

    Merci !
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  2. #2
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    Salut,
    dans le XAML si tu ajoutes un élément comme enfant d'un autre, il faut que la classe behind correspondante ait marqué la propriété comme étant un contenu (attribut "ContentProperty", enfin si je me souviens bien).
    Comme ce n'est pas le cas avec la propriété Value de l'objet Setter, le compilateur considère que c'est faux car tu ne peux pas attacher un frameworkelement comme enfant visuel logique de "Value" du "Setter" (en fait, toi, tu veux le valoriser au niveau de la cible du Setter). Tu rencontreras le même phénomène si tu essaies de faire un truc du genre qui suit sur un style pour ContentControl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <Setter Property="Content">
        <Setter.Value>
    ......
    </Setter>
    Idem pour les propriétés Child des ViewBox et autres, etc...

    Je ne sais pas si j'ai été clair, si quelqu'un de plus pédagogue passe dans le coin...

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Je vais tenter de reformuler, voir si j'ai bien compris : Le faire que ce qu'on set par l'intermédiaire d'un setter accepte un sous arbre XAML est totalement indépendant du fait que la propriété value du setter accepte ou pas un sous arbre. Et en l'occurrence, elle ne l'accepte pas.

    C'est bien ça ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    je viens de me relire le lendemain, effectivement je suis pas des plus clairs mdr...

    De manière plus "pratique" :

    Si tu écris ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                                <FrameworkElement>
                                    <FrameworkElement.ContextMenu>
                                        <ContextMenu>
                                            ...
                                        </ContextMenu>
                                    </FrameworkElement.ContextMenu>
                                </FrameworkElement>
    Le compilateur va capter que tu affectes un objet ContextMenu que tu déclares comme menu contextuel de l'élément, parce que ça se passe dans l'arborescence de l'élément (au niveau de la déclaration, attention, les ContextMenu ne font pas partie du même VisualTree et ne sont pas "enfants" au sens hierarchique de l'élément auquel tu les "attaches").

    Par contre, dans ton exemple (valoriser la propriété ContextMenu par le biais d'un Setter), le compilateur semble en quelque sorte "isoler" le contexte de l'élément, et pour lui la propriété ContextMenu étant de type Object, il ne voit pas à quoi relier le truc ; en fait c'est comme s'il traduisais ton xaml comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <object>
        <ContextMenu>
            ...
        </ContextMenu>
     </object>
    Du coup, comme le code behind de "object" ne prévoit pas la gestion du contenu direct en xaml, il te sort cette superbe Exception...

    Une chose est sûre, les exceptions et le débuggage en général en WPF c'est assez déstabilisant, surtout au début (si tu t'amuses à filer les StackTrace de ce genre d'erreurs, tu hallucines devant le nombre de méthodes parcourues pour un simple "Click" par exemple...)

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/02/2014, 11h29
  2. [Débutant] Problème compréhension code
    Par patxy dans le forum ASP.NET
    Réponses: 4
    Dernier message: 20/02/2012, 10h19
  3. problème compréhension code
    Par mitherkiller dans le forum SDL
    Réponses: 3
    Dernier message: 13/04/2007, 09h38
  4. [MFC]Problème compréhension code
    Par bitardo dans le forum MFC
    Réponses: 1
    Dernier message: 23/05/2006, 15h56
  5. [Débutant] problème de compréhension
    Par Sylvester dans le forum Général Java
    Réponses: 18
    Dernier message: 21/07/2005, 09h16

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