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


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

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

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

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

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

У элемента 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 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

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

В следующем примере элемент ScrollViewer создается в окне, содержащем текст и прямоугольник. Элементы ScrollBar появляются, только когда они нужны. Когда вы изменяете размер окна, элементы ScrollBar появляются и исчезают в зависимости от обновленных значений свойств ComputedHorizontalScrollBarVisibility и 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>

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

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

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

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

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

См. также