Como posso obter uma barra de rolagem vertical na minha caixa de listagem?
-
19-08-2019 - |
Pergunta
No exemplo abaixo, eu tenho uma lista com dezenas de nomes de fonte na mesma.
Eu teria pensado que teria automaticamente uma barra de rolagem vertical sobre ele para que você pode selecionar qualquer tipo de letra, e não apenas os primeiros na lista, mas isso não acontece.
Então eu adicionei um "ScrollViewer" e que coloca uma "área de barra de rolagem" no lado direito, mas não há nenhuma barra de rolagem na área de barra de rolagem para que você possa rolar (!).
Por que não é uma barra de rolagem automática e como posso forçá-lo a ter uma barra de rolagem?
<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>
Solução
O problema com a sua solução é que você está colocando uma barra de rolagem em torno de uma caixa de listagem, onde você provavelmente vai querer colocá-lo dentro da caixa de listagem.
Se você quiser forçar uma barra de rolagem na sua listagem, use a propriedade ScrollBar.VerticalScrollBarVisibility anexo.
<ListBox
ItemsSource="{Binding}"
ScrollViewer.VerticalScrollBarVisibility="Visible">
</ListBox>
Definir esse valor como Auto irá aparecer a barra de rolagem em uma base necessária.
Outras dicas
ListBox
já contém ScrollViewer
. Por padrão, o ScrollBar
vai aparecer quando há mais conteúdo do que espaço. Mas alguns recipientes redimensionar-se para acomodar os seus conteúdos (por exemplo StackPanel
), por isso nunca há "mais conteúdo do que o espaço". Nesses casos, o ListBox
é sempre dado tanto espaço quanto é necessário para o conteúdo.
Para calcular a condição de ter mais conteúdo do espaço, o tamanho deve ser conhecido. Verifique se o seu ListBox
tem um tamanho restrito, seja, definindo o tamanho explicitamente no elemento ListBox
em si, ou a partir do painel do host.
No caso do painel de acolhimento é StackPanel
vertical e você quer VerticalScrollBar
você deve definir a altura em si ListBox
. Para outros tipos de recipientes, por exemplo Grid
, o ListBox
pode ser limitado pelo recipiente. Por exemplo, você pode alterar o código original para esta aparência:
<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>
Note que não é apenas o recipiente primário que é importante. No seu exemplo, o recipiente primário é um Grid
, mas porque essa Grid
está contido por um StackPanel
, o StackPanel
externa é ampliada para acomodar a sua Grid
filho imediato, de modo que a criança pode se expandir para acomodar sua criança (o ListBox
).
Se você restringir a altura em qualquer ponto -, definindo a altura do ListBox
, definindo a altura do Grid
interior, ou simplesmente fazendo o recipiente exterior um Grid
- em seguida, uma barra de rolagem vertical aparecerá automaticamente sempre que houver muitos itens da lista para caber no controle.
Eu adicionei uma "altura" a minha caixa de listagem e adicionado a barra de rolagem bem.
Barra de deslocamento é adicionado à caixa de listagem automaticamente a menos que a sua visibilidade é definida como Oculto. Sempre que o tamanho da Lista de Itens excede a um, que podem ser mostrados dentro de uma caixa lista caixa lista vertical ou horizontal pode ser visto durante o tempo de execução.
No meu caso o número de itens na caixa de listagem é dinâmico, então eu não queria usar a propriedade de altura. Eu costumava MaxHeight vez e ele funciona muito bem. A barra de rolagem aparece quando ele preenche o espaço que eu alocado para ele.
Eu estava tendo o mesmo problema, eu tive uma caixa de combinação seguido por uma caixa de listagem em um StackPanel e a barra de rolagem para a caixa de listagem não estava aparecendo. Eu resolvi isso colocando os dois em um DockPanel vez. Eu defini o ComboBox DockPanel.Dock = "top" e deixe a caixa de listagem preencher o espaço restante.
XAML ListBox Scroller - Windows 10 (UWP)
<Style TargetType="ListBox">
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Visible"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible"/>
</Style>