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 :

ComboxBox avec des sous-menus


Sujet :

Windows Presentation Foundation

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Points : 77
    Points
    77
    Par défaut ComboxBox avec des sous-menus
    Bonjour,

    J'ai besoin de pouvoir afficher une liste hiérarchique dans une ComboBox. Malheureusement, le type MenuItem n'est pas supporté par la ComboBox
    J'ai alors pensé à partir directement d'un Menu. J'ai créé une attached property pour exposer la propriété SelectedItem
    Par contre, j'aimerais avoir le même "look and feel" que pour une ComboBox mais je ne sais pas comment m'y prendre

    Merci d'avance.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Mars 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 50
    Points : 37
    Points
    37
    Par défaut
    Salut,
    Est-ce que quelque chose comme ça te conviendrais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     <Menu HorizontalAlignment="Left" Margin="93,65,0,223">
                <!-- This first menu item is styled to look like a combo box. -->
                    <MenuItem>
                        <MenuItem.Header>
                            <StackPanel Orientation="Horizontal">
                                <!-- Yes, the access key works! -->
                                    <Label Padding="0" Margin="0 0 0 1">_Sort by</Label>
                                    <Border>
                                        <!-- The toggle button looks identical to the one used on a combo box
                    because I based the definition below on the relevant portion of the
                    combo box's default control template. -->
                <ToggleButton IsChecked="False" IsHitTestVisible="False"
                        BorderBrush="{TemplateBinding Border.BorderBrush}"
                        Background="{TemplateBinding Panel.Background}">
                <ToggleButton.Style>
                    <Style TargetType="ToggleButton">
                    <Setter Property="OverridesDefaultStyle" Value="True" />
                    <!-- The toggle control just needs visually appear. It doesn't
                        need to receive focus or be a tab stop. -->
                                            <Setter Property="Focusable" Value="False" />
                                            <Setter Property="IsTabStop" Value="False" />
                                            <Setter Property="Control.Template">
                                                <Setter.Value>
                                                    <ControlTemplate TargetType="ToggleButton">
                                                        <Path Data="M0,0L3.5,4 7,0z" Fill="#FF000000" Name="Arrow"
                                        Margin="3,1,0,0" HorizontalAlignment="Center" VerticalAlignment="Center" />
                                                    </ControlTemplate>
                                                </Setter.Value>
                                            </Setter>
                                            </Style>
                                            </ToggleButton.Style>
                                            </ToggleButton>
                                    </Border>
                            </StackPanel>
                        </MenuItem.Header>
                        <MenuItem Header="_Name">
                            <MenuItem Header="_Last" />
                            <MenuItem Header="_First" />
                        </MenuItem>
                    <MenuItem Header="_Tel">
                        <MenuItem Header="_Fix" />
                        <MenuItem Header="_Portable" />
                    </MenuItem>
                </MenuItem>
            </Menu>
    Tout est expliqué ici.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Points : 77
    Points
    77
    Par défaut
    Effectivement, j'avais lu cet article mais le problème c'est que chaque item et sous-item conserve le "look and feel" d'un MenuItem.
    Ce qui est gênant car j'affiche dans ma fenêtre plusieurs ComboBox, certains avec une liste simple d'items, d'autre avec une liste hiérarchique.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 50
    Points : 37
    Points
    37
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <Menu HorizontalAlignment="Left" Margin="93,65,0,223">
                <!-- This first menu item is styled to look like a combo box. -->
                <MenuItem>
                    <MenuItem.Header>
                        <StackPanel Orientation="Horizontal">
                            <!-- Yes, the access key works! -->
                            <Label Padding="0" Margin="0 0 0 1">_Sort by</Label>
                            <Border>
                                <!-- The toggle button looks identical to the one used on a combo box
                    because I based the definition below on the relevant portion of the
                    combo box's default control template. -->
                                <ToggleButton IsChecked="False" IsHitTestVisible="False"
                        BorderBrush="{TemplateBinding Border.BorderBrush}"
                        Background="{TemplateBinding Panel.Background}">
                                    <ToggleButton.Style>
                                        <Style TargetType="ToggleButton">
                                            <Setter Property="OverridesDefaultStyle" Value="True" />
                                            <!-- The toggle control just needs visually appear. It doesn't
                        need to receive focus or be a tab stop. -->
                                            <Setter Property="Focusable" Value="False" />
                                            <Setter Property="IsTabStop" Value="False" />
                                            <Setter Property="Control.Template">
                                                <Setter.Value>
                                                    <ControlTemplate TargetType="ToggleButton">
                                                        <Path Data="M0,0L3.5,4 7,0z" Fill="#FF000000" Name="Arrow"
                                        Margin="3,1,0,0" HorizontalAlignment="Center" VerticalAlignment="Center" />
                                                    </ControlTemplate>
                                                </Setter.Value>
                                            </Setter>
                                        </Style>
                                    </ToggleButton.Style>
                                </ToggleButton>
                            </Border>
                        </StackPanel>
                    </MenuItem.Header>
                    <ComboBox Width="85" Height="21.96" Text="Name" IsEditable="True" IsReadOnly="True">
                        <ComboBoxItem>_Last</ComboBoxItem>
                        <ComboBoxItem>_First</ComboBoxItem>
                    </ComboBox>
                    <ComboBox Width="85" Height="21.96" Text="Tel" IsEditable="True" IsReadOnly="True">
                        <ComboBoxItem>_Fix</ComboBoxItem>
                        <ComboBoxItem>_Portable</ComboBoxItem>
                    </ComboBox>
                </MenuItem>
            </Menu>
    Et ça ? Tu as directement tes comboBox. Le isEditable c'est pour que la propriété Text s'affiche.
    Après ce n'est pas encore très agréable, mais je pense que tu as moyen de bidouiller des propriété de style pour afficher ça comme il faut.

    EDIT : Ce post pourrait t'aider. Il met un Text par défaut dans la ComboBox, en passant par un Behaviors. Il donne l'archive de son projet, donc tu peux tout récupérer pour l'adapter à ton code.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Points : 77
    Points
    77
    Par défaut
    En fait, j'utilise la propriété ItemsSource de MenuItem et , automatiquement, cela génère des MenuItem.
    J'ai l'impression que je suis obligé de passer par des styles.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 50
    Points : 37
    Points
    37
    Par défaut
    Tu lui donnes quoi à ItemSource ? Une liste de string ? Si ce n'est pas un objet trop complexe tu dois pouvoir générer toi même tes composants de menu du côté c#.

    Sinon côté style je t'avoue que je ne connais pas très très bien, du coup je laisse la main à quelqu'un de plus compétent pour ça.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Points : 77
    Points
    77
    Par défaut
    Il s'agit d'une liste hiérarchique. Le type de donnée est XElement et ItemsSource est bindé sur Elements.
    Avec un template simple, cela donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <HierarchicalDataTemplate ItemsSource="{Binding Path=Elements}" x:Key="MenuItemTemplate">
        <StackPanel Orientation="Horizontal" Margin="1">
            <Label Content="{Binding Path=Name}" />
        </StackPanel>
    </HierarchicalDataTemplate>

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Points : 77
    Points
    77
    Par défaut
    Finalement, plutôt que d'utiliser un Menu, je vais afficher un TreeView dans ma ComboBox

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

Discussions similaires

  1. Créer un menu avec des sous menus
    Par unix27 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 22/07/2009, 11h32
  2. menu css avec des sous menus
    Par souaddemaroc dans le forum Mise en page CSS
    Réponses: 17
    Dernier message: 23/12/2008, 21h59
  3. un cas avec des Sous Classes
    Par Daeron dans le forum Langage
    Réponses: 7
    Dernier message: 17/01/2006, 18h39
  4. Réponses: 2
    Dernier message: 28/09/2005, 18h08
  5. fichier .bat : problèmes avec des sous-répertoires
    Par aymron dans le forum Windows
    Réponses: 4
    Dernier message: 23/06/2005, 10h33

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