Поделиться через


Общие сведения об элементе управления ScrollViewer

Часто содержимое в пользовательском интерфейсе занимает больше места, чем вмещает отображаемая область экрана компьютера. Элемент управления ScrollViewer предоставляет удобный способ включить прокрутку содержимого в приложениях Windows Presentation Foundation (WPF). В данном разделе представлены сведения об элементе ScrollViewer и приведены примеры его использования.

В этом разделе содержатся следующие подразделы.

  • Элемент управления ScrollViewer

  • Физическая и логическая прокрутка

  • Определение и использование элемента ScrollViewer

  • Стили элемента управления ScrollViewer

  • Разбиение документов на страницы

  • См. также

Элемент управления ScrollViewer

Существуют два предопределенных элемента управления, обеспечивающих прокрутку в приложениях WPF: ScrollBar и ScrollViewer. Элемент управления ScrollViewer включает в себя горизонтальный и вертикальный элементы ScrollBar и контейнер содержимого (например, элемент Panel) для отображения других видимых элементов в прокручиваемой области. Чтобы использовать элемент ScrollBar для прокрутки содержимого, необходимо предварительно создать пользовательский объект. Тем не менее, можно непосредственно использовать элемент ScrollViewer, так как это составной элемент управления, включающий в себя функциональные возможности ScrollBar.

Элемент управления ScrollViewer реагирует на команды мыши и клавиатуры и определяет множество методов для прокрутки содержимого на предопределенные значения приращения. Для обнаружения изменений состояния элемента ScrollViewer можно использовать событие ScrollChanged.

Объект ScrollViewer может иметь только одного потомка, обычно это элемент Panel, в котором может размещаться коллекция элементов Children. Свойство Content определяет единственного потомка ScrollViewer.

Физическая илогическая прокрутка

Физическая прокрутка используется для прокрутки на предопределенное приращение, которое обычно является значением, объявленным в точках. Логическая прокрутка используется для прокрутки до следующего элемента в логическом дереве. Физическая прокрутка является поведением прокрутки по умолчанию для большинства элементов Panel. WPF поддерживает оба типа прокрутки.

Интерфейс IScrollInfo

Интерфейс IScrollInfo представляет основную область прокрутки в ScrollViewer или в производном элементе управления. Интерфейс определяет свойства и методы прокрутки, которые могут быть реализованы элементами Panel, требующими прокрутки на логическую единицу, а не на физическое приращение. Приведение экземпляра класса IScrollInfo к производному экземпляру класса Panel и последующее использование его методов прокрутки, обеспечивают удобный способ перехода к следующей логической единице в коллекции потомка вместо прокрутки на точканое приращение. По умолчанию элемент управления ScrollViewer поддерживает прокрутку на физические единицы.

Объекты StackPanel и VirtualizingStackPanel реализуют интерфейс IScrollInfo и имеют встроенную поддержку логической прокрутки. Для элементов управления разметкой, имеющих встроенную поддержку логической прокрутки, можно реализовать физическую прокрутку, поместив хост-элемент Panel в ScrollViewer и задав для свойства CanContentScroll значение false.

В следующем примере кода демонстрируется приведение экземпляра IScrollInfo к StackPanel и использование методов прокрутки содержимого (LineUp и 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
private void spLineUp(object sender, RoutedEventArgs e)
{
    ((IScrollInfo)sp1).LineUp();
}
private void spLineDown(object sender, RoutedEventArgs e)
{
    ((IScrollInfo)sp1).LineDown();
}

Определение и использование элемента ScrollViewer

В следующем примере объект ScrollViewer создается в окне, содержащем текст и прямоугольник. Элементы ScrollBar выводятся только в случае необходимости. При изменении размера окна элементы ScrollBar отображаются и исчезают согласно изменению значений свойств ComputedHorizontalScrollBarVisibility и ComputedVerticalScrollBarVisibility.


'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 Border
myScrollViewer.Content = myStackPanel
Me.Content = myScrollViewer

            // 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 Border
            myScrollViewer.Content = myStackPanel;

            // Add the Border as the Content of the Parent Window Object
            mainWindow.Content = myScrollViewer;
            mainWindow.Show ();


         // 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 Border
         myScrollViewer->Content = myStackPanel;

         // Add the Border as the Content of the Parent Window Object
         mainWindow->Content = myScrollViewer;
         mainWindow->Show();

<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="https://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>

Стили элемента управления ScrollViewer

Как и к остальным элементам управления в Windows Presentation Foundation, к ScrollViewer могут быть применены различные стили для изменения поведения элемента управления при его отрисовки. Дополнительные сведения о стилях элементов управления см. в разделе Стилизация и использование шаблонов.

Разбиение документов на страницы

Для содержимого документа альтернативой прокрутке является контейнер документа, поддерживающий разбиение на страницы. Класс FlowDocument предназначен для документов, которые размещаются в элементе управления просмотра, например в FlowDocumentPageViewer, который поддерживает разбиение содержимого на несколько страниц, что устраняет необходимость в прокрутке. DocumentViewer предоставляет решение для просмотра содержимого FixedDocument, в котором для вывода содержимого вне области отображения применяется традиционная прокрутка.

Дополнительные сведения о форматах документа и параметрах представления см. в разделе Документы в WPF.

См. также

Задачи

Практическое руководство. Создание элемента ScrollViewer

Ссылки

ScrollViewer

ScrollBar

IScrollInfo

Основные понятия

Документы в WPF

Стили и шаблоны элемента ScrollBar

Оптимизация производительности: элементы управления