Cómo agregar una ScrollBar a un Stackpanel

106

En mi aplicación WPF, tengo un Stackpanel que contiene varios controles dentro de ellos. ¿Cómo puedo agregar una barra de desplazamiento a este panel de pila?

Shamim Hafiz
fuente

Respuestas:

162

Ponlo en un ScrollViewer.

Joey
fuente
Gracias. Después de colocar un ScrollViewer a su alrededor, no se muestra todo el contenido. Intenté configurar Alto y Ancho en Automático, pero no tuve suerte. ¿Por qué debería mostrarse solo una porción limitada?
Shamim Hafiz
5
No tengo ni idea. Su pregunta tenía dos oraciones, lo que es un pequeño detalle para anticipar cualquier problema potencial.
Joey
Entendido, estaba colocando la etiqueta de apertura en el lugar equivocado. Muchas gracias por la ayuda.
Shamim Hafiz
Respuesta simple y perfecta.
David Piao
94

Stackpanel no tiene un mecanismo de desplazamiento integrado, pero siempre puede envolver el StackPanel en un ScrollViewer

<ScrollViewer VerticalScrollBarVisibility="Auto">
  <StackPanel ... />
</ScrollViewer>
biju
fuente
3
Bueno, StackPanelimplementa IScrollInfoy ofrece una serie de métodos relacionados con el desplazamiento. ¿Estás seguro de que no tiene ningún tipo de mecanismo de desplazamiento "incorporado"?
OR Mapper
4
from msdn.microsoft.com/en-us/library/… ... "Esta propiedad no está destinada a ser utilizada en su código. Se expone públicamente para cumplir con un contrato de interfaz (IScrollInfo). Establecer esta propiedad no tiene ningún efecto. Si necesita un desplazamiento físico en lugar de un desplazamiento lógico, envuelva el StackPanel en un ScrollViewer y establezca su propiedad CanContentScroll en false ".
Skinner
11

Funciona así:

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

Para StackPanel orientado horizontalmente, poner explícitamente ambas visibilidades de la barra de desplazamiento funcionó para mí para obtener la barra de desplazamiento horizontal.

    <ScrollViewer VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Auto" >
        <StackPanel Orientation="Horizontal" />
    </ScrollViewer>
VijayKP
fuente
1
Repetición de respuestas anteriores.
vapcguy
-4

Si quiere decir que desea desplazarse por varios elementos en su panel de pila, intente poner una cuadrícula alrededor. Por definición, un panel de pila tiene una longitud infinita.

Así que prueba algo como esto:

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

Incluso podría hacer que esto funcione con un ScrollViewer

Anormalmente
fuente
4
Este código se saca de contexto. ¿Podría eliminar las dependencias para que el código se pueda utilizar sin más modificaciones?
Markus Jarderot