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?

Respuestas:


162

Ponlo en un ScrollViewer.


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>

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

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>

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.