ScrollViewer – přehled
Obsah v uživatelském rozhraní je často větší než oblast zobrazení obrazovky počítače. Ovládací prvek ScrollViewer poskytuje pohodlný způsob, jak povolit posouvání obsahu v aplikacích WPF (Windows Presentation Foundation). Toto téma představuje prvek ScrollViewer a obsahuje několik příkladů použití.
Ovládací prvek ScrollViewer
Existují dva předdefinované prvky, které umožňují posouvání v aplikacích WPF: ScrollBar a ScrollViewer. Ovládací prvek ScrollViewer zapouzdřuje vodorovné a svislé ScrollBar prvky a kontejner obsahu (například prvek Panel), aby bylo možné zobrazit další viditelné prvky v posuvné oblasti. Chcete-li použít prvek ScrollBar pro posouvání obsahu, je nutné vytvořit vlastní objekt. Prvek ScrollViewer však můžete použít samostatně, protože se jedná o složený ovládací prvek, který zapouzdřuje ScrollBar funkce.
Ovládací prvek ScrollViewer reaguje na příkazy z myši a klávesnice a definuje řadu metod, které umožňují posunovat obsah předem stanovenými kroky. Událost ScrollChanged můžete použít ke zjištění změny v ScrollViewer stavu.
ScrollViewer může mít pouze jeden podřízený prvek, obvykle prvek Panel, který může hostovat Children kolekci prvků. Vlastnost Content definuje jediné dítě ScrollViewer.
Fyzické a logické posouvání
Fyzické posouvání se používá k posouvání obsahu předem určeným fyzickým přírůstkem, obvykle hodnotou deklarovanou v pixelech. Logické posouvání slouží k posouvání na další položku v logickém stromu. Fyzické rolování je výchozím chováním rolování pro většinu Panel prvků. WPF podporuje oba typy posouvání.
Rozhraní IScrollInfo
Rozhraní IScrollInfo představuje hlavní oblast posouvání v rámci ScrollViewer nebo odvozeného ovládacího prvku. Rozhraní definuje vlastnosti a metody posouvání, které lze implementovat pomocí Panel prvků, které vyžadují posouvání logickou jednotkou, a nikoli fyzickým přírůstkem. Přetypování instance IScrollInfo na odvozenou Panel a následné použití jejích technik posouvání poskytuje užitečný způsob, jak se posouvat na další logickou jednotku v podřízené kolekci, místo přirůstání o pixely. Ve výchozím nastavení ovládací prvek ScrollViewer podporuje posouvání podle fyzických jednotek.
StackPanel i VirtualizingStackPanel implementují IScrollInfo i nativně podporují logické posouvání. U ovládacích prvků rozložení, které nativně podporují logické posouvání, můžete fyzické posouvání dosáhnout tak, že zabalíte prvek hostitele Panel do ScrollViewer a nastavíte vlastnost CanContentScroll na false
.
Následující příklad kódu ukazuje, jak přetypovat instanci IScrollInfo na StackPanel a používat metody posouvání obsahu (LineUp a LineDown) definované rozhraním.
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
Definování a použití elementu ScrollViewer
Následující příklad vytvoří ScrollViewer v okně, které obsahuje nějaký text a obdélník. ScrollBar prvky se zobrazí pouze v případě, že jsou nezbytné. Při změně velikosti okna se prvky ScrollBar zobrazí a zmizí z důvodu aktualizovaných hodnot vlastností ComputedHorizontalScrollBarVisibility a 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>
Styling a ScrollViewer
Stejně jako všechny ovládací prvky ve Windows Presentation Foundation lze ScrollViewer stylovat, aby se změnilo výchozí chování vykreslování ovládacího prvku. Další informace o stylu ovládacího prvku naleznete v tématu Styling a Šablonování.
Stránkování dokumentů
Pro obsah dokumentu je alternativou k posouvání zvolit kontejner dokumentů, který podporuje stránkování. FlowDocument je určen pro dokumenty, které jsou navržené tak, aby byly hostované v ovládacím prvku zobrazení, například FlowDocumentPageViewer, který podporuje stránkování obsahu na více stránkách, což brání nutnosti posouvání. DocumentViewer poskytuje řešení pro zobrazení obsahu FixedDocument, který používá tradiční posouvání k zobrazení obsahu mimo sféru oblasti zobrazení.
Další informace o formátech dokumentů a možnostech prezentace naleznete v tématu Dokumenty ve WPF.
Viz také
.NET Desktop feedback