Jak dodać ScrollBar do Stackpanel

106

W mojej aplikacji WPF mam Stackpanel zawierający kilka kontrolek wewnątrz nich. Jak mogę dodać pasek przewijania do tego panelu stosu.

Shamim Hafiz
źródło

Odpowiedzi:

162

Umieść to w ScrollViewer.

Joey
źródło
Dzięki. Po umieszczeniu wokół niego ScrollViewer cała zawartość nie jest wyświetlana. Próbowałem ustawić wysokość i szerokość na Auto, ale bez powodzenia. Dlaczego ma być pokazywana tylko ograniczona część?
Shamim Hafiz
5
Nie mam pojęcia. Twoje pytanie składało się z dwóch zdań, co zawierało trochę szczegółów, aby przewidzieć potencjalne problemy.
Joey
Rozumiem, umieszczałem otwierający tag w złym miejscu. Wielkie dzięki za pomoc.
Shamim Hafiz
Prosta i doskonała odpowiedź.
David Piao
94

Stackpanel nie ma wbudowanego mechanizmu przewijania, ale zawsze możesz zawinąć StackPanel w ScrollViewer

<ScrollViewer VerticalScrollBarVisibility="Auto">
  <StackPanel ... />
</ScrollViewer>
biju
źródło
3
Cóż, StackPanelimplementuje IScrollInfoi oferuje wiele metod związanych z przewijaniem. Czy na pewno nie ma żadnego „wbudowanego” mechanizmu przewijania?
LUB Mapper
4
z msdn.microsoft.com/en-us/library/… ... "Ta właściwość nie jest przeznaczona do użycia w kodzie. Jest ujawniana publicznie w celu wypełnienia umowy interfejsu (IScrollInfo). Ustawienie tej właściwości nie ma żadnego efektu. Jeśli potrzebujesz fizycznego przewijania zamiast przewijania logicznego, zawiń StackPanel w ScrollViewer i ustaw jego właściwość CanContentScroll na false. "
Skinner,
11

Działa to tak:

<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
źródło
0

W przypadku StackPanel zorientowanego poziomo jawne umieszczenie obu widoczności paska przewijania zadziałało, aby uzyskać poziomy pasek przewijania.

    <ScrollViewer VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Auto" >
        <StackPanel Orientation="Horizontal" />
    </ScrollViewer>
VijayKP
źródło
1
Powtórz poprzednie odpowiedzi.
vapcguy
-4

Jeśli masz na myśli, że chcesz przewijać wiele elementów w panelu stosu, spróbuj umieścić wokół niego siatkę. Z definicji panel typu stackpanel ma nieskończoną długość.

Więc spróbuj czegoś takiego:

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

Możesz nawet sprawić, by to zadziałało za pomocą ScrollViewer

Dziwacznie
źródło
4
Ten kod jest wyrwany z kontekstu. Czy możesz usunąć zależności, aby kod był użyteczny bez dalszych modyfikacji?
Markus Jarderot