Pregunta

En el ejemplo a continuación tengo un ListBox con docenas de nombres de fuentes en él.

Pensé que automáticamente tendría una barra de desplazamiento vertical para que pueda seleccionar CUALQUIER fuente, no solo las primeras de la lista, pero no es así.

Entonces agregué un " ScrollViewer " y eso pone un "área de barra de desplazamiento" a la derecha pero no hay 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>
¿Fue útil?

Solución

El problema con su solución es que está colocando una barra de desplazamiento alrededor de un ListBox donde probablemente quiera colocarlo 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>

Establecer este valor en Automático abrirá la barra de desplazamiento según sea necesario.

Otros consejos

ListBox ya contiene ScrollViewer . Por defecto, la ScrollBar aparecerá cuando haya más contenido que espacio. Pero algunos contenedores cambian de tamaño para acomodar su contenido (por ejemplo, StackPanel ), por lo que nunca hay "más contenido que espacio". En tales casos, el ListBox siempre tiene 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 en sí, o desde el panel host.

En caso de que el panel host sea StackPanel vertical y desee VerticalScrollBar , debe establecer la Altura en ListBox . Para otros tipos de contenedores, p. Grid , el ListBox puede estar limitado 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 lo importante no es solo el contenedor inmediato. En su ejemplo, el contenedor inmediato es un Grid , pero debido a que Grid está contenido en un StackPanel , el StackPanel externo se expande para acomodar su hijo Grid inmediato, de modo que ese hijo pueda expandirse para acomodar its hijo (el ListBox ).

Si restringe la altura en cualquier punto & # 8212; configurando la altura del ListBox , configurando la altura de la Grid interna, o simplemente haciendo del contenedor externo una Grid & # 8212 ; entonces aparecerá una barra de desplazamiento vertical automáticamente cada vez que haya demasiados elementos de lista para caber en el control.

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

La barra de desplazamiento se agrega al cuadro de lista automáticamente 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, el cuadro de lista vertical u horizontal se puede ver durante el tiempo de ejecución.

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

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. Resolví esto poniendo los dos en un DockPanel en su lugar. Configuré el ComboBox DockPanel.Dock = " Top " y deje que ListBox llene el espacio restante.

Desplazador XAML ListBox - Windows 10 (UWP)

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top