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>
Foi útil?

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>

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top