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


Обзор 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, которое использует традиционную прокрутку для отображения содержимого вне области отображения.

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

См. также