Domanda

Nell'esempio seguente ho un ListBox con dozzine di nomi di font al suo interno.

Avrei pensato che avrebbe automaticamente una barra di scorrimento verticale in modo da poter selezionare QUALSIASI font, non solo i primi nell'elenco, ma non lo è.

Quindi ho aggiunto un " ScrollViewer " e che mette un'area " barra di scorrimento " sulla destra ma non c'è barra di scorrimento nell'area della barra di scorrimento in modo da poter scorrere (!).

Perché una barra di scorrimento non è automatica e come posso forzarla ad avere una barra di scorrimento?

<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>
È stato utile?

Soluzione

Il problema con la tua soluzione è che stai mettendo una barra di scorrimento attorno a un ListBox dove probabilmente vuoi metterlo all'interno del ListBox.

Se si desidera forzare una barra di scorrimento in ListBox, utilizzare la proprietà associata ScrollBar.VerticalScrollBarVisibility.

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

Impostando questo valore su Auto, la barra di scorrimento verrà popolata secondo necessità.

Altri suggerimenti

ListBox contiene già ScrollViewer . Per impostazione predefinita, ScrollBar verrà visualizzato quando c'è più contenuto che spazio. Ma alcuni contenitori si ridimensionano per adattarsi al loro contenuto (ad esempio StackPanel ), quindi non c'è mai "più contenuto dello spazio". In tali casi, il ListBox viene sempre fornito dello spazio necessario per il contenuto.

Per calcolare la condizione di avere più contenuto dello spazio, è necessario conoscere le dimensioni. Assicurati che il tuo ListBox abbia una dimensione vincolata, impostando esplicitamente la dimensione sull'elemento ListBox stesso, o dal pannello host.

Nel caso in cui il pannello host sia StackPanel verticale e tu desideri VerticalScrollBar devi impostare l'altezza su ListBox stesso. Per altri tipi di contenitori, ad es. Grid , ListBox può essere vincolato dal contenitore. Ad esempio, puoi modificare il codice originale in questo modo:

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

Nota che non è importante solo il contenitore immediato. Nel tuo esempio, il contenitore immediato è un Grid , ma poiché quel Grid è contenuto da un StackPanel , il StackPanel esterno viene espanso per accogliere il figlio Grid immediato, in modo tale che quel figlio possa espandersi per ospitare il suo figlio (il ListBox ).

Se limiti l'altezza in qualsiasi punto & # 8212; impostando l'altezza del ListBox , impostando l'altezza del Grid interno, o semplicemente trasformando il contenitore esterno in un Grid & # 8212 ; quindi una barra di scorrimento verticale apparirà automaticamente ogni volta che ci sono troppi elementi dell'elenco per adattarsi al controllo.

Ho aggiunto una "Altezza" al mio ListBox e ha aggiunto bene la barra di scorrimento.

La barra di scorrimento viene aggiunta automaticamente alla casella Elenco a meno che la sua visibilità non sia impostata su Nascosto. Ogni volta che la dimensione delle voci di elenco supera quella, che può essere mostrata all'interno di una casella di riepilogo è possibile visualizzare una casella di riepilogo verticale o orizzontale durante il runtime.

Nel mio caso il numero di elementi in ListBox è dinamico, quindi non volevo usare la proprietà Height. Ho usato MaxHeight invece e funziona bene. La barra di scorrimento viene visualizzata quando riempie lo spazio che mi è stato assegnato.

Stavo avendo lo stesso problema, avevo un ComboBox seguito da un ListBox in uno StackPanel e la barra di scorrimento per ListBox non veniva visualizzata. Ho risolto questo mettendo invece i due in un DockPanel. Ho impostato ComboBox DockPanel.Dock = " Top " e lasciare che ListBox riempia lo spazio rimanente.

Scroller ListBox XAML - Windows 10 (UWP)

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top