Общие сведения об элементе управления 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