132

In my WPF application, I have a Stackpanel containing several controls inside them. How can I add a Scrollbar to this stackpanel.

5 Answers 5

211

Put it into a ScrollViewer.

4
  • 1
    Thanks. After putting a ScrollViewer around it, the entire content doesn't show up. I tried setting Height and Width to Auto, but no luck. Why should only a limited portion show? Commented Jun 6, 2011 at 9:57
  • 8
    I have no clue. Your question was two sentences long which is a bit little detail to anticipate any potential problems.
    – Joey
    Commented Jun 6, 2011 at 9:59
  • Got it, I was placing the opening tag in the wrong place. Thanks a lot for the help. Commented Jun 6, 2011 at 10:03
  • 1
    Simple and perfect answer.
    – JM217
    Commented Feb 13, 2020 at 13:47
128

Stackpanel doesn't have built in scrolling mechanism but you can always wrap the StackPanel in a ScrollViewer

<ScrollViewer VerticalScrollBarVisibility="Auto">
  <StackPanel ... />
</ScrollViewer>
2
  • 3
    Well, StackPanel does implement IScrollInfo and offers a number of scrolling-related methods. Are you sure it does not have any kind of "built-in" scrolling mechanism? Commented Apr 23, 2013 at 18:13
  • 5
    from msdn.microsoft.com/en-us/library/…... "This property is not intended for use in your code. It is exposed publicly to fulfill an interface contract (IScrollInfo). Setting this property has no effect. If you require physical scrolling instead of logical scrolling, wrap the StackPanel in a ScrollViewer and set its CanContentScroll property to false."
    – Skinner
    Commented Jul 25, 2017 at 1:55
16

It works like this:

<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);
3

For horizontally oriented StackPanel, explicitly putting both the scrollbar visibilities worked for me to get the horizontal scrollbar.

    <ScrollViewer VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Auto" >
        <StackPanel Orientation="Horizontal" />
    </ScrollViewer>
1
  • 2
    Repeat of previous answers.
    – vapcguy
    Commented Sep 19, 2016 at 20:30
-4

If you mean, you want to scroll through multiple items in your stackpanel, try putting a grid around it. By definition, a stackpanel has infinite length.

So try something like this:

   <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>

You could even make this work with a ScrollViewer

1
  • 5
    This code is taken out of context. Could you remove the dependencies, so the code is usable without further modifications? Commented Jun 6, 2011 at 10:07

Not the answer you're looking for? Browse other questions tagged or ask your own question.