2009-01-23 21 views
66

En el ejemplo siguiente, tengo un ListBox con docenas de nombres de fuentes.¿Cómo puedo obtener una barra de desplazamiento vertical en mi ListBox?

Hubiera pensado que tendría automáticamente una barra de desplazamiento vertical para poder seleccionar CUALQUIER fuente, no solo las primeras en la lista, pero no es así.

Así que agregué un "ScrollViewer" y eso pone un "área de barra de desplazamiento" a la derecha pero no hay una barra de desplazamiento en el área de la barra de desplazamiento para que pueda desplazarse (!).

¿Por qué una barra de desplazamiento no es automática y cómo la forzo a tener una barra de desplazamiento?

<StackPanel Name="stack1"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="2*"></RowDefinition> 
      <RowDefinition Height="*"></RowDefinition> 
     </Grid.RowDefinitions> 
     <ScrollViewer> 
      <ListBox Grid.Row="0" Name="lstFonts" Margin="3" ItemsSource="{x:Static Fonts.SystemFontFamilies}"/> 
     </ScrollViewer> 
    </Grid> 
</StackPanel> 

Respuesta

116

El problema con su solución es que está poniendo una barra de desplazamiento en torno a un cuadro de lista, donde es probable que desee ponerlo dentro del cuadro de lista.

Si desea forzar una barra de desplazamiento en su ListBox, use la propiedad adjunta ScrollBar.VerticalScrollBarVisibility.

<ListBox 
    ItemsSource="{Binding}" 
    ScrollViewer.VerticalScrollBarVisibility="Visible"> 
</ListBox> 

Al establecer este valor en Auto se abrirá la barra de desplazamiento según sea necesario.

+1

En mi caso yo había puesto el '' ListBox' dentro de un ScrollViewer' también y los 'ListBoxItems' se extiende tan amplia como querían fuera del tamaño de 'ListBox'. Quitar el 'ScrollViewer' y configurar' ScrollViewer.VerticalScrollBarVisibility = "Visible" 'y' ScrollViewer.HorizontalScrollBarVisibility = "Disabled" 'hizo el truco. ¡Gracias por tu ayuda! – mandarin

16

Agregué una "Altura" a mi ListBox y agregó la barra de desplazamiento muy bien.

+6

Trate de evitar el uso de las propiedades de altura y ancho ya que pueden dificultar los cambios en el camino. Será mejor que vayas con la solución de JaredPar. –

+0

Hago eso pero solo pone un "área de barra de desplazamiento" a la derecha sin barra de desplazamiento, y mi lista baja desde el final de mi ventana hacia abajo hasta la eternidad, ¿cómo puedo decir el cuadro de lista (detenerse en la parte inferior de la ventana)? –

+15

Como está en un StackPanel, se le está dando alegremente todo el espacio que necesita, por lo que no cree que * necesite * una barra de desplazamiento. – Donnelle

3

La barra de desplazamiento se agrega al cuadro de lista automáticamente a menos que su visibilidad esté establecida en Oculto. Siempre que el tamaño de los elementos de la lista exceda el que se puede mostrar dentro de un cuadro de lista, se puede ver el cuadro de lista vertical u horizontal durante el tiempo de ejecución.

23

ListBox ya contiene ScrollViewer. Por defecto, el ScrollBar aparecerá cuando haya más contenido que espacio. Pero algunos contenedores se redimensionan para acomodar sus contenidos (por ejemplo, StackPanel), de modo que nunca hay "más contenido que espacio". En tales casos, el ListBox siempre se da tanto espacio como sea necesario para el contenido.

Para calcular la condición de tener más contenido que espacio, se debe conocer el tamaño. Asegúrese de que su ListBox tenga un tamaño restringido, estableciendo explícitamente el tamaño en el elemento ListBox, o desde el panel de host.

En caso de que el panel de host sea vertical StackPanel y desee VerticalScrollBar, debe establecer la altura en ListBox. Para otros tipos de contenedores, p. Grid, ListBox puede estar restringido por el contenedor. Por ejemplo, puede cambiar su código original al tener este aspecto:

<Grid Name="grid1"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="2*"></RowDefinition> 
      <RowDefinition Height="*"></RowDefinition> 
     </Grid.RowDefinitions> 
     <ListBox Grid.Row="0" Name="lstFonts" Margin="3" 
       ItemsSource="{x:Static Fonts.SystemFontFamilies}"/> 
    </Grid> 
</Grid> 

en cuenta que no es sólo el envase primario que es importante. En su ejemplo, el envase inmediato es un Grid, pero debido a que Grid está contenido por un StackPanel, el exterior StackPanel se expande para acomodar su hijo inmediato Grid, de manera que ese niño puede expandirse para acomodar su hijo (el ListBox).

Si limitarse la altura en cualquier punto — ajustando la altura de la ListBox, ajustando la altura del interior Grid, o simplemente haciendo que el envase exterior una Grid — a continuación, una barra de desplazamiento vertical aparecerá automáticamente cualquier momento hay demasiados elementos de lista para caber en el control.

+0

El uso de DockPanel como contenedor primario omite la necesidad de saber cuántos elementos planea agregar como secundarios o predefinir cualquier atributo de altura. Para cada niño, defina DockPanel.Dock = Top. Esto hace que sus "Scrollviewer-Childs" muestren sus barras de desplazamiento según sea necesario. No probado generalmente, funcionó en mi caso de uso. BR, Daniel – dba

1

En mi caso, el número de elementos en el ListBox es dinámico, así que no quería usar la propiedad Height. Usé MaxHeight en su lugar y funciona muy bien. La barra de desplazamiento aparece cuando llena el espacio que le asigné.

0

Estaba teniendo el mismo problema, tenía un ComboBox seguido de un ListBox en un StackPanel y la barra de desplazamiento para el ListBox no se mostraba. Lo resolví poniendo los dos en un DockPanel en su lugar. Configuré ComboBox DockPanel.Dock = "Top" y dejo que ListBox llene el espacio restante.

0

XAML ListBox desplazador - Windows 10 (UWP)

<Style TargetType="ListBox"> 
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Visible"/> 
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible"/> 
</Style> 

Cuestiones relacionadas