wpf - ¿Cómo puedo obtener una barra de desplazamiento vertical en mi ListBox?
xaml scrollviewer (7)
En el siguiente ejemplo, tengo un ListBox con docenas de nombres de fuentes.
Pensé que automáticamente tendría 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 obligo 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>
Agregué una "Altura" a mi ListBox y agregó la barra de desplazamiento muy bien.
El problema con su solución es que está colocando una barra de desplazamiento alrededor de un ListBox donde probablemente quiera ponerlo dentro de ListBox.
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.
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é.
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 aparecía. Lo resolví poniendo los dos en un DockPanel en su lugar. Configuré ComboBox DockPanel.Dock = "Top" y dejo que ListBox llene el espacio restante.
La barra de desplazamiento se agrega automáticamente al cuadro de lista, a menos que su visibilidad esté configurada 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.
ListBox
ya contiene ScrollViewer
. Por defecto, ScrollBar
aparecerá cuando haya más contenido que espacio. Pero algunos contenedores se redimensionan para acomodar sus contenidos (por ejemplo, StackPanel
), por lo que nunca hay "más contenido que espacio". En tales casos, al ListBox
siempre se le 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, ya sea estableciendo el tamaño explícitamente en el elemento ListBox
mismo, o desde el panel de host.
En caso de que el panel de host sea StackPanel
vertical y desee VerticalScrollBar
, debe establecer Height en ListBox
. Para otros tipos de contenedores, por ejemplo, Grid
, ListBox
puede estar restringido por el contenedor. Por ejemplo, puede cambiar su código original para que se vea así:
<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>
Tenga en cuenta que no es solo el contenedor inmediato lo que es importante. En su ejemplo, el contenedor inmediato es una Grid
, pero como esa Grid
está contenida en un StackPanel
, el StackPanel
externo se expande para acomodar su Grid
secundaria inmediata, de modo que ese hijo pueda expandirse para acomodar a su hijo (el ListBox
).
Si restringe la altura en cualquier punto: estableciendo la altura del ListBox
, configurando la altura de la Grid
interna, o simplemente haciendo que el contenedor externo sea una Grid
, entonces una barra de desplazamiento vertical aparecerá automáticamente cada vez que haya demasiados enumere los elementos para que quepan en el control.
XAML ListBox Scroller - Windows 10 (UWP)
<Style TargetType="ListBox">
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Visible"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible"/>
</Style>