130 votes

Comment faire en sorte qu'un groupe de boutons à bascule se comporte comme des boutons radio dans WPF ?

J'ai un groupe de boutons qui doivent agir comme des boutons de basculement, mais aussi comme des boutons radio où un seul bouton peut être sélectionné / enfoncé à un moment donné. Il faut aussi qu'il y ait un état où aucun des boutons n'est sélectionné / enfoncé.

Le comportement sera un peu comme la barre d'outils de Photoshop, où zéro ou un des outils est sélectionné à tout moment !

Une idée de la manière dont cela peut être mis en œuvre dans WPF ?

317voto

C'est le moyen le plus simple à mon avis.

<RadioButton Style="{StaticResource {x:Type ToggleButton}}" />

Profitez-en ! -- Pricksaw

31 votes

Celle-ci devrait être la réponse choisie de loin. Elle vous offre tous les avantages d'un bouton radio sans les inconvénients de la liaison à un contrôleur. J'ai d'abord essayé de lier un ensemble distinct de boutons radios invisibles, mais cela a entraîné une surcharge inutile et s'est terminé par un bogue où tous les boutons cliqués semblaient mis en évidence mais pas nécessairement cochés.

19 votes

Ou, si vous avez besoin d'appliquer ceci à tous les RadioButtons à l'intérieur d'un élément (par exemple, une Grid ), utilisez <Grid.Resources> <Style TargetType="RadioButton" BasedOn="{StaticResource {x:Type ToggleButton}}" /> </Grid.Resources> .

17 votes

L'inconvénient de cette méthode est que vous ne pouvez pas décocher un bouton radio en cliquant sur un bouton coché.

38voto

Bryan Anderson Points 9044

Le moyen le plus simple est de styliser une ListBox pour utiliser des ToggleButtons pour son ItemTemplate.

<Style TargetType="{x:Type ListBox}">
    <Setter Property="ListBox.ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <ToggleButton Content="{Binding}" 
                              IsChecked="{Binding IsSelected, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}"
                />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

Vous pouvez ensuite utiliser la propriété SelectionMode de la liste de sélection pour gérer le mode SingleSelect ou MultiSelect.

0 votes

Merci pour ce partage ! je me demandais si c'était une bonne pratique... mais cela semble être ok...

1 votes

@LeeLouviere : Pourriez-vous expliquer pourquoi ? N'est-ce pas là un excellent exemple d'utilisation du modèle d'article ?

4 votes

C'est un mauvais exemple car vous confondez affichage et comportement. Vous modifiez l'affichage via le modèle de données, mais vous conservez le comportement d'une boîte de liste et d'un bouton de commande. no le comportement d'un ensemble de boutons radio/boutons basculants. L'interaction avec le clavier est bizarre. Une meilleure solution serait un ItemsControl avec des RadioButtons, stylisés comme des ToggleButtons (voir l'autre réponse la plus votée).

32voto

RoKK Points 172
<RadioButton Content="Point" >
    <RadioButton.Template>
        <ControlTemplate>
            <ToggleButton IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
                          Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"/>
        </ControlTemplate>
    </RadioButton.Template>
</RadioButton>

ça marche pour moi, profitez-en !

0 votes

Je sais que ce n'est pas la question. Mais que faire si le bouton doit se comporter comme les radioboutons où l'un d'eux doit toujours être sélectionné ?

0 votes

Pour répondre à ma propre question : lisez la réponse de Uday Kiran :-)

0 votes

Sympa, cela agit de la même manière que le bouton Toggle. Cliquez pour cocher et cliquez sur le même bouton pour décocher. Et une fois que j'ai mis tous les RadioButtons dans un même groupe, ils agissent comme des boutons Radio. Merci RoKK ! !!

5voto

Sam Points 186

Vous pouvez toujours utiliser un événement générique sur le clic du ToggleButton qui définit tous les ToggleButton.IsChecked dans un groupcontrol (Grid, WrapPanel, ...) à false avec l'aide de VisualTreeHelper ; puis revérifier l'expéditeur. Ou quelque chose de ce genre.

private void ToggleButton_Click(object sender, RoutedEventArgs e)
    {
        int childAmount = VisualTreeHelper.GetChildrenCount((sender as ToggleButton).Parent);

        ToggleButton tb;
        for (int i = 0; i < childAmount; i++)
        {
            tb = null;
            tb = VisualTreeHelper.GetChild((sender as ToggleButton).Parent, i) as ToggleButton;

            if (tb != null)
                tb.IsChecked = false;
        }

        (sender as ToggleButton).IsChecked = true;
    }

4voto

ArsenMkrt Points 24447

Vous pouvez mettre une grille avec des boutons radio et créer un modèle de bouton pour les boutons radio. il suffit ensuite de supprimer la vérification par programme si vous ne voulez pas que les boutons soient basculés.

0 votes

Mais en utilisant des boutons radio, y a-t-il un moyen de désélectionner tous les boutons ? Une fois sélectionnés, je ne vois pas de moyen facile de les désélectionner !

0 votes

Les boutons radio ont une propriété IsChecked, que vous pouvez définir à false dans le code lorsque vous avez besoin de l'aide d'une autre personne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X