Come posso ottenere una barra di scorrimento verticale nel mio ListBox?
-
19-08-2019 - |
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>
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>