Udostępnij za pośrednictwem


ScrollViewer — omówienie

Zawartość w interfejsie użytkownika jest często większa niż obszar wyświetlania ekranu komputera. Kontrolka ScrollViewer zapewnia wygodny sposób włączania przewijania zawartości w aplikacjach Windows Presentation Foundation (WPF). W tym temacie przedstawiono element ScrollViewer i przedstawiono kilka przykładów użycia.

Kontrolka Przewijania (ScrollViewer)

Istnieją dwa wstępnie zdefiniowane elementy, które umożliwiają przewijanie w aplikacjach WPF: ScrollBar i ScrollViewer. Kontrolka ScrollViewer hermetyzuje elementy poziome i pionowe ScrollBar oraz kontener zawartości (np. element Panel), aby wyświetlić inne widoczne elementy w obszarze przewijanym. Aby użyć elementu ScrollBar do przewijania zawartości, musisz utworzyć obiekt niestandardowy. Można jednak użyć samego elementu ScrollViewer, ponieważ jest to kontrolka złożona, która hermetyzuje funkcjonalność ScrollBar.

Kontrolka ScrollViewer odpowiada zarówno na polecenia myszy, jak i klawiatury, i definiuje wiele metod, za pomocą których można przewijać zawartość według wstępnie określonych przyrostów. Możesz użyć zdarzenia ScrollChanged, aby wykryć zmianę stanu ScrollViewer.

ScrollViewer może zawierać tylko jeden element podrzędny, zazwyczaj element Panel, który może zawierać kolekcję elementów Children. Właściwość Content definiuje jedyny element podrzędny ScrollViewer.

Przewijanie fizyczne a logiczne

Przewijanie fizyczne służy do przewijania zawartości przez wstępnie określony przyrost fizyczny, zazwyczaj przez wartość zadeklarowaną w pikselach. Przewijanie logiczne służy do przewijania do następnego elementu w drzewie logicznym. Przewijanie fizyczne to domyślne zachowanie przewijania dla większości elementów Panel. WPF obsługuje oba typy przewijania.

Interfejs IScrollInfo

Interfejs IScrollInfo reprezentuje główny region przewijania w ScrollViewer lub pochodnej kontrolce. Interfejs definiuje właściwości przewijania i metody, które mogą być implementowane przez elementy Panel, wymagające przewijania według jednostki logicznej, a nie w sposób fizyczny. Rzutowanie wystąpienia IScrollInfo do pochodnego Panel, a następnie użycie jego metod przewijania zapewnia przydatny sposób przewijania do następnej jednostki logicznej w kolekcji podrzędnej, a nie przez przyrost pikseli. Domyślnie kontrolka ScrollViewer obsługuje przewijanie według jednostek fizycznych.

StackPanel i VirtualizingStackPanel implementują IScrollInfo i natywnie obsługują przewijanie logiczne. W przypadku kontrolek układu, które natywnie obsługują przewijanie logiczne, można uzyskać fizyczne przewijanie, owijając element Panel hosta w ScrollViewer i ustawiając właściwość CanContentScroll na false.

W poniższym przykładzie kodu pokazano, jak rzutować wystąpienie IScrollInfo na StackPanel i używać metod przewijania zawartości (LineUp i LineDown) zdefiniowanych przez interfejs.

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

Definiowanie i używanie elementu ScrollViewer

Poniższy przykład tworzy ScrollViewer w oknie zawierającym jakiś tekst i prostokąt. ScrollBar elementy są wyświetlane tylko wtedy, gdy są one niezbędne. Po zmianie rozmiaru okna ScrollBar elementy są wyświetlane i znikają ze względu na zaktualizowane wartości właściwości ComputedHorizontalScrollBarVisibility i 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>

Stylowanie programu ScrollViewer

Podobnie jak wszystkie kontrolki w programie Windows Presentation Foundation, ScrollViewer można stylizować w celu zmiany domyślnego zachowania renderowania kontrolki. Aby uzyskać dodatkowe informacje na temat stylów kontrolek, zobacz Styleing and Templating.

Stronicowanie dokumentów

W przypadku zawartości dokumentu alternatywą do przewijania jest wybranie kontenera dokumentów obsługującego stronicowanie. FlowDocument jest przeznaczony dla dokumentów do hostowania w kontrolce wyświetlania, takiej jak FlowDocumentPageViewer, która obsługuje stronicowanie zawartości na wielu stronach, eliminując konieczność przewijania. DocumentViewer udostępnia rozwiązanie do wyświetlania zawartości FixedDocument, które używa tradycyjnego przewijania do wyświetlania zawartości poza obszarem wyświetlania.

Aby uzyskać dodatkowe informacje na temat formatów dokumentów i opcji prezentacji, zobacz Documents in WPF.

Zobacz też