Como adicionar um ScrollBar a um Stackpanel

106

Em meu aplicativo WPF, tenho um Stackpanel contendo vários controles dentro deles. Como posso adicionar uma barra de rolagem a este painel de pilha.

Shamim Hafiz
fonte

Respostas:

162

Coloque-o em um ScrollViewer.

Joey
fonte
Obrigado. Depois de colocar um ScrollViewer em torno dele, todo o conteúdo não aparece. Tentei definir Height e Width como Auto, mas sem sorte. Por que apenas uma parte limitada deve ser exibida?
Shamim Hafiz
5
Eu não tenho ideia. A sua pergunta tem duas frases longas, que são um pequeno detalhe para antecipar quaisquer problemas potenciais.
Joey
Entendi, eu estava colocando a tag de abertura no lugar errado. Muito obrigado pela ajuda.
Shamim Hafiz
Resposta simples e perfeita.
David Piao
94

Stackpanel não tem mecanismo de rolagem integrado, mas você sempre pode envolver o StackPanel em um ScrollViewer

<ScrollViewer VerticalScrollBarVisibility="Auto">
  <StackPanel ... />
</ScrollViewer>
biju
fonte
3
Bem, StackPanelele implementa IScrollInfoe oferece vários métodos relacionados à rolagem. Tem certeza de que ele não possui nenhum tipo de mecanismo de rolagem "embutido"?
OR Mapper
4
de msdn.microsoft.com/en-us/library/… ... "Esta propriedade não se destina ao uso em seu código. Ela é exposta publicamente para cumprir um contrato de interface (IScrollInfo). A definição desta propriedade não tem efeito. Se você requer rolagem física em vez de rolagem lógica, envolva o StackPanel em um ScrollViewer e defina sua propriedade CanContentScroll como false. "
Skinner
11

Funciona assim:

<ScrollViewer VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Disabled" Width="340" HorizontalAlignment="Left" Margin="12,0,0,0">
        <StackPanel Name="stackPanel1" Width="311">

        </StackPanel>
</ScrollViewer>

TextBox tb = new TextBox();
tb.TextChanged += new TextChangedEventHandler(TextBox_TextChanged);
stackPanel1.Children.Add(tb);
Arnisz
fonte
0

Para StackPanel orientado horizontalmente, colocar explicitamente ambas as visibilidades da barra de rolagem funcionou para mim para obter a barra de rolagem horizontal.

    <ScrollViewer VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Auto" >
        <StackPanel Orientation="Horizontal" />
    </ScrollViewer>
VijayKP
fonte
1
Repita as respostas anteriores.
vapcguy
-4

Se você quer rolar por vários itens em seu painel de pilha, tente colocar uma grade ao redor dele. Por definição, um stackpanel tem comprimento infinito.

Então, tente algo assim:

   <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <StackPanel Width="311">
              <TextBlock Text="{Binding A}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" FontStretch="Condensed" FontSize="28" />
              <TextBlock Text="{Binding B}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
        </StackPanel>
    </Grid>

Você pode até mesmo fazer isso funcionar com um ScrollViewer

Extremamente
fonte
4
Este código foi retirado do contexto. Você poderia remover as dependências para que o código pudesse ser usado sem modificações adicionais?
Markus Jarderot