40 votes

Comment un StackPanel WPF peut-il se remplir verticalement de bas en haut ?

Je dois pouvoir remplir un stackpanel con buttons mais les boutons doit d'abord apparaître au bas de la pile, puis se remplir de manière ascendante. . Les boutons sont créés dynamiquement et il y en a un nombre inconnu, de sorte que le piratage visuel ne fonctionne pas. J'ai essayé de faire des essais avec des alignements verticaux, mais en vain.

57voto

Pop Catalin Points 25033

Comme cela :

<StackPanel VerticalAlignment="Bottom">
    ...
</StackPanel>

et pour remplir les boutons vers le haut, vous devez insérer les boutons à la position 0, au lieu de les ajouter.

17voto

Nir Points 18250

Vous pouvez également faire pivoter le StackPanel de 180 degrés pour que les boutons s'empilent de bas en haut, puis les faire pivoter à nouveau de 180 degrés pour les remettre à l'endroit :

<StackPanel>
    <!-- rotate all buttons inside this panel -->
    <StackPanel.Resources>
        <Style TargetType="Button">
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <RotateTransform Angle="180"/>
                </Setter.Value>
            </Setter>
        </Style>
    </StackPanel.Resources>

    <!-- rotate the stack panel -->
    <StackPanel.LayoutTransform>
       <RotateTransform Angle="180"/>
    </StackPanel.LayoutTransform>

    <!-- content -->
    <Button>1</Button>
    <Button>2</Button>

</StackPanel>

10voto

foss Points 449

Une autre solution consiste à utiliser un DockPanel.

Il suffit de définir la valeur LastChildFill sur false dans le DockPanel.

Définissez ensuite la propriété Dock attachée à chaque bouton que vous ajoutez à Bottom avant de l'ajouter au DockPanel.

exemple :

            var button = new Button();
            DockPanel.SetDock(button, Dock.Bottom);

4voto

Oleg Points 671

La meilleure façon de résoudre le problème est de mettre en place un conteneur personnalisé dérivé de stackpanel mais la solution la plus rapide et la plus pratique si des éléments sont ajoutés au moment de l'exécution est la suivante

    public Window1()
    {
        InitializeComponent();
        for (int i = 0; i < 10; i++)
        {
            Button btn = new Button();
            btn.Content = "Button " + i;
            MyStack.Children.Insert(0, btn);
        }
    }

Il suffit d'insérer un élément à la position 0 au lieu de l'ajouter.

2voto

TLE Points 405

Essayez de placer le StackPanel dans un autre conteneur (pas un StackPanel ; peut-être un DockPanel) et de l'aligner en bas. Ensuite, lorsque vous remplirez les boutons, placez chaque nouveau bouton dans la première position.

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