Compartilhar via


Visão geral do ScrollViewer

O conteúdo dentro de uma interface do usuário geralmente é maior do que a área de exibição de uma tela de computador. O controle ScrollViewer fornece uma maneira conveniente de habilitar a rolagem de conteúdo em aplicativos do WPF (Windows Presentation Foundation). Este tópico apresenta o elemento ScrollViewer e fornece vários exemplos de uso.

O controle ScrollViewer

Há dois elementos predefinidos que permitem a rolagem em aplicativos WPF: ScrollBar e ScrollViewer. O controle ScrollViewer encapsula elementos ScrollBar horizontais e verticais e um contêiner de conteúdo (como um elemento Panel) para exibir outros elementos visíveis em uma área rolável. Você deve criar um objeto personalizado para usar o elemento ScrollBar para rolagem de conteúdo. No entanto, você pode usar o elemento ScrollViewer por si só porque ele é um controle composto que encapsula ScrollBar funcionalidade.

O controle ScrollViewer responde a comandos de mouse e teclado e define vários métodos com os quais rolar o conteúdo por incrementos predeterminados. Você pode usar o evento ScrollChanged para detectar uma alteração em um estado de ScrollViewer.

Um ScrollViewer só pode ter um filho, normalmente um elemento Panel que pode hospedar uma coleção Children de elementos. A propriedade Content define o único filho do ScrollViewer.

Rolagem física versus rolagem lógica

A rolagem física é usada para rolar o conteúdo por um incremento físico predeterminado, normalmente por um valor declarado em pixels. A rolagem lógica é usada para rolar até o próximo item na árvore lógica. A rolagem física é o comportamento de rolagem padrão para a maioria dos elementos Panel. O WPF dá suporte a ambos os tipos de rolagem.

A interface IScrollInfo

A interface IScrollInfo representa a região de rolagem principal dentro de um controle ScrollViewer ou derivado. A interface define propriedades de rolagem e métodos que podem ser implementados por elementos Panel que exigem rolagem por unidade lógica, em vez de por um incremento físico. A conversão de uma instância de IScrollInfo para um Panel derivado e, em seguida, o uso de seus métodos de rolagem oferece uma maneira útil de rolar até a próxima unidade lógica em uma coleção de filhos, em vez de usar incremento de pixel. Por padrão, o controle ScrollViewer dá suporte à rolagem por unidades físicas.

StackPanel e VirtualizingStackPanel implementam IScrollInfo e dão suporte nativo à rolagem lógica. Para controles de layout que dão suporte nativo à rolagem lógica, você ainda pode obter rolagem física encapsulando o elemento Panel do host em um ScrollViewer e definindo a propriedade CanContentScroll como false.

O exemplo de código a seguir demonstra como converter uma instância de IScrollInfo em um StackPanel e usar métodos de rolagem de conteúdo (LineUp e LineDown) definidos pela interface.

private void spLineUp(object sender, RoutedEventArgs e)
{
    ((IScrollInfo)sp1).LineUp();
}
private void spLineDown(object sender, RoutedEventArgs e)
{
    ((IScrollInfo)sp1).LineDown();
}
Private Sub spLineUp(ByVal sender As Object, ByVal args As RoutedEventArgs)

    CType(sp1, IScrollInfo).LineUp()
End Sub
Private Sub spLineDown(ByVal sender As Object, ByVal args As RoutedEventArgs)

    CType(sp1, IScrollInfo).LineDown()
End Sub

Definindo e usando um elemento ScrollViewer

O exemplo a seguir cria um ScrollViewer em uma janela que contém algum texto e um retângulo. ScrollBar elementos aparecem somente quando são necessários. Quando você redimensiona a janela, os elementos ScrollBar aparecem e desaparecem devido aos valores atualizados das propriedades ComputedHorizontalScrollBarVisibility e ComputedVerticalScrollBarVisibility.


// Create the application's main window
mainWindow = gcnew System::Windows::Window();
mainWindow->Title = "ScrollViewer Sample";

// Define a ScrollViewer
myScrollViewer = gcnew ScrollViewer();
myScrollViewer->HorizontalScrollBarVisibility = ScrollBarVisibility::Auto;

// Add Layout control
myStackPanel = gcnew StackPanel();
myStackPanel->HorizontalAlignment = HorizontalAlignment::Left;
myStackPanel->VerticalAlignment = VerticalAlignment::Top;

TextBlock^ myTextBlock = gcnew TextBlock();
myTextBlock->TextWrapping = TextWrapping::Wrap;
myTextBlock->Margin = System::Windows::Thickness(0, 0, 0, 20);
myTextBlock->Text = "Scrolling is enabled when it is necessary. Resize the Window, making it larger and smaller.";

Rectangle^ myRectangle = gcnew Rectangle();
myRectangle->Fill = Brushes::Red;
myRectangle->Width = 500;
myRectangle->Height = 500;

// Add child elements to the parent StackPanel
myStackPanel->Children->Add(myTextBlock);
myStackPanel->Children->Add(myRectangle);

// Add the StackPanel as the lone child of the ScrollViewer
myScrollViewer->Content = myStackPanel;

// Add the ScrollViewer as the Content of the parent Window object
mainWindow->Content = myScrollViewer;
mainWindow->Show();


// Create the application's main window
mainWindow = new Window ();
mainWindow.Title = "ScrollViewer Sample";

// Define a ScrollViewer
myScrollViewer = new ScrollViewer();
myScrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;

// Add Layout control
myStackPanel = new StackPanel();
myStackPanel.HorizontalAlignment = HorizontalAlignment.Left;
myStackPanel.VerticalAlignment = VerticalAlignment.Top;

TextBlock myTextBlock = new TextBlock();
myTextBlock.TextWrapping = TextWrapping.Wrap;
myTextBlock.Margin = new Thickness(0, 0, 0, 20);
myTextBlock.Text = "Scrolling is enabled when it is necessary. Resize the Window, making it larger and smaller.";

Rectangle myRectangle = new Rectangle();
myRectangle.Fill = Brushes.Red;
myRectangle.Width = 500;
myRectangle.Height = 500;

// Add child elements to the parent StackPanel
myStackPanel.Children.Add(myTextBlock);
myStackPanel.Children.Add(myRectangle);

// Add the StackPanel as the lone child of the ScrollViewer
myScrollViewer.Content = myStackPanel;

// Add the ScrollViewer as the Content of the parent Window object
mainWindow.Content = myScrollViewer;
mainWindow.Show ();


'Define a ScrollViewer.
Dim myScrollViewer As New ScrollViewer
myScrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto

'Add Layout control.
Dim myStackPanel As New StackPanel
myStackPanel.HorizontalAlignment = System.Windows.HorizontalAlignment.Left
myStackPanel.VerticalAlignment = System.Windows.VerticalAlignment.Top

Dim myTextBlock As New TextBlock
myTextBlock.TextWrapping = TextWrapping.Wrap
myTextBlock.Margin = New Thickness(0, 0, 0, 20)
myTextBlock.Text = "Scrolling is enabled when it is necessary. Resize the Window, making it larger and smaller."

Dim myRectangle As New Rectangle
myRectangle.Fill = Brushes.Red
myRectangle.Width = 500
myRectangle.Height = 500

'Add child elements to the parent StackPanel.
myStackPanel.Children.Add(myTextBlock)
myStackPanel.Children.Add(myRectangle)

'Add the StackPanel as the lone child of the ScrollViewer
myScrollViewer.Content = myStackPanel

'Add the ScrollViewer as the Content of the parent Window object
Me.Content = myScrollViewer
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      WindowTitle="ScrollViewer Sample">
  <ScrollViewer HorizontalScrollBarVisibility="Auto">
    <StackPanel VerticalAlignment="Top" HorizontalAlignment="Left">
      <TextBlock TextWrapping="Wrap" Margin="0,0,0,20">Scrolling is enabled when it is necessary. 
      Resize the window, making it larger and smaller.</TextBlock>
      <Rectangle Fill="Red" Width="500" Height="500"></Rectangle>
    </StackPanel>
  </ScrollViewer>
</Page>

Estilizando um ScrollViewer

Como todos os controles no Windows Presentation Foundation, o ScrollViewer pode ser estilizado para alterar o comportamento de renderização padrão do controle. Para obter informações adicionais sobre aplicação de estilo de controle, consulte Aplicação de estilo e modelagem.

Paginando documentos

Para o conteúdo do documento, uma alternativa à rolagem é escolher um contêiner de documento que dê suporte à paginação. FlowDocument é para documentos projetados para serem hospedados em um controle de exibição, como FlowDocumentPageViewer, que dá suporte à paginação de conteúdo em várias páginas, impedindo a necessidade de rolagem. DocumentViewer fornece uma solução para visualizar o conteúdo de FixedDocument, que usa rolagem tradicional para exibir conteúdo que está fora da área de exibição.

Para obter informações adicionais sobre formatos de documento e opções de apresentação, consulte Documentos no WPF.

Consulte também