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 :

Gestion des IsChecked de MenuItem dans un menu conséquent


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 38
    Par défaut Gestion des IsChecked de MenuItem dans un menu conséquent
    Encore un problème bidon auquel je ne trouve pas de solution miracle :

    J'ai une appli avec un bon menu (plus proche de photoshop que de notepad). Mon souci, c'est de gérer intelligemment le fait que certains MenuItems soient cochés ou pas.

    Je dois donc faire le lien entre l'action courante et les MenuItems checkables.

    Les actions sont gérées dans mon appli par le design pattern Command. Je conserve la commande courante dans une propriété accessible via un singleton CommandManager qui implémente INotifyPropertyChanged.

    J'ai plusieurs idées pour résoudre ce problème mais aucune n'est convaincante, et comme c'est un problème très commun, je pense qu'il y a un mécanisme en WPF pour gérer ca intélligemment. En gros, je pense (enfin, j'espère) qu'il y a un truc comme les RoutedCommand qui au lieu de griser le Menu, indiquerait s'il est coché ou pas.

    Voici les quelques solutions envisageables :
    1) Abonner manuellement chaque MenuItem à INotifyPropertyChanged, et gérer le check dans le handler : MonMenu.IsChecked = (MaPropriété == PropriétéAttendue)
    2) Pour éviter les multiples abonnement ci-dessus, faire un binding OneWay entre le dataContext du menu et la propriété. Et à chaque changement, mettre à jour tous les MenuItems
    3) Dans mon commandManager, exposer autant de propriétés qu'il y a d'actions (IsAction1, IsAction2, ...) et du coup, je peux faire un simple binding entre isChecked et la propriété qui m'intéresse.

    Qu'est ce que vous en dites ?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    je dit que si tu avais un p'tit exemple je comprendrais mieux

  3. #3
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 38
    Par défaut
    euh..ben je vais essayer d'etre plus clair alors..

    j'ai plusieurs MenuHeader. Dedans, plusieurs MenuItem : Item1, Item2, Item3.
    Chaque Item est Checkable.
    Il y a une correspondance entre un Item et une action. Item1 <-> Action1, ...
    L'action courante (il ne peut en avoir qu'une seule à la fois) est stockée dans un CommandManager (singleton)

    Si je ne code aucune logique en ce qui concerne le check des MenuItems, alors il se passe ca :
    1)Je clique sur Item1 -> Item1 devient checké
    2)Je clique sur Item2 -> Item2 devient checké, mais Item1 est resté checké...
    1)Je reclique sur Item1 -> Item1 se dé-check et Item2 est toujours checké...

    Bref, les checkbox ne correspondent pas à l'action courante...

    Etant donné que c'est un problème relativement courant, je pense qu'il existe un mécanisme un peu intelligent pour gérer le fait qu'un menu soit checké ou pas, surement plus adapté que les solutions que j'ai trouvé.

  4. #4
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 38
    Par défaut


    personne n'utilise de menus avec IsCheckable == true ???

    Allez, y a bien un mvp ou 2 qui a déjà vu ca dans sa vie!

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    je sais plus si c'est comme les radio bouton mais tu as peut etre un groupe pour signifier qu'un seul element du groupe peut etre checké a un moment donné
    je vais regarder

    y'aurais bien une solution c'est de mettre des radio bouton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     <Menu Height="30" VerticalAlignment="Top">
                <MenuItem Header="File" Height="26" VerticalAlignment="Top">
                    <RadioButton Content="New Project" Name="miNew" >
                    </RadioButton>
                    <Separator />
                    <RadioButton Content="Open Project" Name="miOpen" >
                    </RadioButton>
                    <MenuItem Header="Close Project" Name="miClose" IsCheckable="True">
                    </MenuItem>
                </MenuItem>
            </Menu>
    si tu leur ajoute un template particulier ca peut ressembler a des menus items

    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      <Window.Resources>
            <ControlTemplate x:Key="Template" TargetType="{x:Type RadioButton}">
                <Border Background="Transparent">
                    <MenuItem Header="{TemplateBinding Content}" IsCheckable="False" IsChecked="{TemplateBinding IsChecked}" IsHitTestVisible="False"/>
                </Border>
            </ControlTemplate>
        </Window.Resources>
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       <Menu Height="82" VerticalAlignment="Top" Margin="0,36,60,0">
                <MenuItem Header="File" Height="26" VerticalAlignment="Top">
                    <RadioButton Content="aaaa" IsChecked="True" Template="{StaticResource Template}"/>
                    <RadioButton Content="bbbb" Template="{StaticResource Template}"/>
                    <RadioButton Content="cccc" Template="{StaticResource Template}"/>
                </MenuItem>
            </Menu>

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    y'aurait une solution un peut plus tordu je vais tenter de te l'expliquer ici
    - tu refais un menu a toi par exemple Controlheckablemenu
    - tu refais des menusitemGrouped avec un dependencyproperty groupname
    - dans le menu tu vas capturer les messages checked MenuItem (comme c'est un routed event tu peux facilement le capturer)

    la tu as deux solutions
    - soit tu parse les menuitemGrouped et tu control le groupname par rapport a celui qui a declanché le message et tu les uncheck
    - soit dans le menuitem grouped tu colle un tableau static qui te permet de controler les instances et dans le check du menuitemgrouped (que tu derrive) tu fais la verrification

    je te l'accorde c'est pas évident, mais normalement ça devrait marcher

    et pourtant je suis pas MVP eheheheheh

Discussions similaires

  1. Réponses: 11
    Dernier message: 28/02/2007, 13h18
  2. Gestion des flux de matières dans 1 atelier
    Par ptit_bleu dans le forum Schéma
    Réponses: 4
    Dernier message: 23/02/2007, 10h55
  3. Gestion des changement de JPanel dans une applet
    Par le Daoud dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 26/06/2006, 15h32
  4. Réponses: 6
    Dernier message: 09/06/2006, 13h17
  5. Gestion des versions d'objets dans les SGBD
    Par bennus dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 09/05/2005, 13h57

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