Comment ajouter un ScrollBar à un Stackpanel

106

Dans mon application WPF, j'ai un Stackpanel contenant plusieurs contrôles à l'intérieur. Comment puis-je ajouter une barre de défilement à ce stackpanel.

Shamim Hafiz
la source

Réponses:

162

Mettez-le dans un fichier ScrollViewer.

Joey
la source
Merci. Après avoir placé un ScrollViewer autour de lui, tout le contenu ne s'affiche pas. J'ai essayé de régler la hauteur et la largeur sur Auto, mais pas de chance. Pourquoi ne devrait-il montrer qu'une partie limitée?
Shamim Hafiz le
5
Je n'ai aucune idée. Votre question était de deux phrases, ce qui est un peu détaillé pour anticiper les problèmes potentiels.
Joey le
Compris, je plaçais la balise d'ouverture au mauvais endroit. Merci beaucoup pour l'aide.
Shamim Hafiz le
Réponse simple et parfaite.
David Piao le
94

Stackpanel n'a pas de mécanisme de défilement intégré, mais vous pouvez toujours envelopper le StackPanel dans un ScrollViewer

<ScrollViewer VerticalScrollBarVisibility="Auto">
  <StackPanel ... />
</ScrollViewer>
biju
la source
3
Eh bien, StackPanelmet en œuvre IScrollInfoet propose un certain nombre de méthodes liées au défilement. Etes-vous sûr qu'il ne dispose d'aucun mécanisme de défilement "intégré"?
OR Mapper
4
from msdn.microsoft.com/en-us/library/… ... "Cette propriété n'est pas destinée à être utilisée dans votre code. Elle est exposée publiquement pour remplir un contrat d'interface (IScrollInfo). La définition de cette propriété n'a aucun effet. Si vous avez besoin d'un défilement physique au lieu d'un défilement logique, enveloppez le StackPanel dans un ScrollViewer et définissez sa propriété CanContentScroll sur false. "
Skinner
11

Cela fonctionne comme ceci:

<ScrollViewer VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Disabled" Width="340" HorizontalAlignment="Left" Margin="12,0,0,0">
        <StackPanel Name="stackPanel1" Width="311">

        </StackPanel>
</ScrollViewer>

TextBox tb = new TextBox();
tb.TextChanged += new TextChangedEventHandler(TextBox_TextChanged);
stackPanel1.Children.Add(tb);
Arnisz
la source
0

Pour StackPanel orienté horizontalement, mettre explicitement les deux visibilités de la barre de défilement a fonctionné pour moi pour obtenir la barre de défilement horizontale.

    <ScrollViewer VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Auto" >
        <StackPanel Orientation="Horizontal" />
    </ScrollViewer>
VijayKP
la source
1
Répétition des réponses précédentes.
vapcguy
-4

Si vous voulez dire que vous voulez faire défiler plusieurs éléments dans votre stackpanel, essayez de mettre une grille autour de lui. Par définition, un stackpanel a une longueur infinie.

Alors essayez quelque chose comme ça:

   <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <StackPanel Width="311">
              <TextBlock Text="{Binding A}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" FontStretch="Condensed" FontSize="28" />
              <TextBlock Text="{Binding B}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
        </StackPanel>
    </Grid>

Vous pouvez même faire fonctionner cela avec un ScrollViewer

Freakishly
la source
4
Ce code est sorti de son contexte. Pourriez-vous supprimer les dépendances afin que le code soit utilisable sans modifications supplémentaires?
Markus Jarderot le