web-dev-qa-db-fra.com

Alignement des contrôles des côtés gauche et droit dans un panneau de pile dans WPF

J'ai le code suivant:

<DockPanel>
    <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
        <RadioButton Content="_Programs" 
                    IsChecked="{Binding Path=ProgramBanksSelected}" IsEnabled="{Binding Path=ProgramsEnabled}" Margin="8" />
        <StackPanel>
            <Label Content="Master" Height="28" Name="MasterFileStatus" VerticalContentAlignment="Center"/>
        </StackPanel>
    </StackPanel>
    ...

Le bouton radio doit être placé du côté gauche dans le panneau de pile (j'ai enlevé quelques boutons pour ne pas encombrer l'exemple) et l'étiquette (que je mets temporairement dans un StackPanel imbriqué) devrait se trouver du côté droit.

J'ai déjà essayé de nombreuses combinaisons d'alignements mais je ne parviens pas à placer l'étiquette du côté droit… .. Que dois-je ajouter pour accomplir cela?

49
Michel Keijzers

N'utilisez simplement pas StackPanel, StackPanelspile. Pour des raisons évidentes, ils ne permettent pas l'alignement dans la direction dans laquelle ils se superposent. Utilisez une Grid , avec des définitions de colonne comme ceci:

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="*" />
    <ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
70
H.B.

Même si c'est vieux, si quelqu'un devait le rencontrer comme moi, voici une solution simple.

Créez une nouvelle grille et placez à l'intérieur de celle-ci deux panneaux de pile avec un alignement horizontal différent.

<Grid>
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
        <!--Code here-->
    </StackPanel>
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
        <!--Code here-->
    </StackPanel>
</Grid>

Le problème possible est que maintenant, sans manipulation supplémentaire, les deux pourraient se chevaucher.

21
Chris

Comme vous avez défini l'orientation StackPanel sur Horizontal, la propriété HorizontalAlignment ne fonctionnera pas avec les éléments enfants. Vous pouvez conserver la StackPanel si vous avez besoin de contrôles supplémentaires, bien que je vous recommande de passer à une Grid (entre autres) pour créer la mise en page souhaitée.

De plus, la Grid vous permettra de contrôler la largeur réelle de chaque colonne:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="50" />
        <ColumnDefinition Width="150" />
    </Grid.ColumnDefinitions>

    <RadioButton
        Grid.Column="0"
        ...
    />

    <Label
        Grid.Column="1"
        ...
    />
</Grid>

4
newfurniturey

L'utilisateur @pasx a raison. Vous devez utiliser DockPanel et ancrer RadioButton sur le côté gauche et votre StackPanel avec l'étiquette sur le côté droit.

<DockPanel>

    <DockPanel 
        DockPanel.Dock="Top" 
        LastChildFill="False" >

        <RadioButton 
            DockPanel.Dock="Left" 
            Content="_Programs" 
            IsChecked="{Binding Path=ProgramBanksSelected}"
            IsEnabled="{Binding Path=ProgramsEnabled}" 
            Margin="8" />

        <StackPanel
            DockPanel.Dock="Right">

            <Label 
                Content="Master" 
                Height="28" 
                Name="MasterFileStatus" 
                VerticalContentAlignment="Center"/>

        </StackPanel>

    </DockPanel>
    ...
0
Alex34758