Panoramica di ScrollViewer
Il contenuto all'interno di un'interfaccia utente è spesso più grande dell'area di visualizzazione dello schermo di un computer. Il controllo ScrollViewer offre un modo pratico per abilitare lo scorrimento del contenuto nelle applicazioni Windows Presentation Foundation (WPF). In questo argomento viene presentato l'elemento ScrollViewer e vengono forniti diversi esempi di utilizzo.
Controllo ScrollViewer
Esistono due elementi predefiniti che consentono lo scorrimento nelle applicazioni WPF: ScrollBar e ScrollViewer. Il controllo ScrollViewer incapsula gli elementi orizzontale e verticale ScrollBar e un contenitore di contenuto (ad esempio un elemento Panel) per visualizzare altri elementi visibili in un'area scorrevole. È necessario compilare un oggetto personalizzato per usare l'elemento ScrollBar per lo scorrimento del contenuto. Tuttavia, è possibile usare l'elemento ScrollViewer da solo perché è un controllo composito che incapsula la funzionalità di ScrollBar.
Il controllo ScrollViewer risponde sia ai comandi del mouse che alla tastiera e definisce numerosi metodi con cui scorrere il contenuto in base a incrementi predeterminati. È possibile usare l'evento ScrollChanged per rilevare una modifica in uno stato di ScrollViewer.
Un ScrollViewer può avere un solo elemento figlio, in genere un elemento Panel che può ospitare una raccolta di elementi Children. La proprietà Content definisce l'unico elemento figlio del ScrollViewer.
Scorrimento fisico e logico
Lo scorrimento fisico viene usato per scorrere il contenuto in base a un incremento fisico predeterminato, in genere da un valore dichiarato in pixel. Lo scorrimento logico viene usato per scorrere fino all'elemento successivo nell'albero logico. Lo scorrimento fisico è il comportamento di scorrimento predefinito per la maggior parte degli elementi Panel. WPF supporta entrambi i tipi di scorrimento.
Interfaccia IScrollInfo
L'interfaccia IScrollInfo rappresenta l'area di scorrimento principale all'interno di un controllo ScrollViewer o derivato. L'interfaccia definisce proprietà e metodi di scorrimento che possono essere implementati da Panel elementi che richiedono lo scorrimento in base all'unità logica, anziché da un incremento fisico. Eseguire il cast di un'istanza di IScrollInfo a un Panel derivato e quindi usare i metodi di scorrimento fornisce un modo utile per scorrere fino all'unità logica successiva in una raccolta figlio, anziché in base all'incremento di pixel. Per impostazione predefinita, il controllo ScrollViewer supporta lo scorrimento in base alle unità fisiche.
StackPanel e VirtualizingStackPanel implementano IScrollInfo e supportano lo scorrimento logico in modo nativo. Per i controlli di layout che supportano lo scorrimento logico in modo nativo, è comunque possibile ottenere lo scorrimento fisico racchiudendo l'elemento Panel host in un ScrollViewer e impostando la proprietà CanContentScroll su false
.
Nell'esempio di codice seguente viene illustrato come convertire un'istanza di IScrollInfo in un StackPanel e usare i metodi di scorrimento del contenuto (LineUp e LineDown) definiti dall'interfaccia.
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
Definizione e utilizzo di un elemento ScrollViewer
Nell'esempio seguente viene creato un ScrollViewer in una finestra contenente testo e rettangolo. ScrollBar elementi vengono visualizzati solo quando sono necessari. Quando si ridimensiona la finestra, gli elementi ScrollBar vengono visualizzati e scompaiono, a causa dei valori aggiornati delle proprietà ComputedHorizontalScrollBarVisibility e 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>
Applicazione di stili a ScrollViewer
Come tutti i controlli in Windows Presentation Foundation, il ScrollViewer può essere stilizzato per modificare il comportamento di rendering predefinito del controllo. Per ulteriori informazioni sulla stilizzazione dei controlli, vedere Stilizzazione e Modelli.
Impaginazione di documenti
Per il contenuto del documento, un'alternativa allo scorrimento consiste nel scegliere un contenitore di documenti che supporta l'impaginazione. FlowDocument è destinato ai documenti progettati per essere ospitati all'interno di un controllo di visualizzazione, ad esempio FlowDocumentPageViewer, che supporta la impaginazione del contenuto in più pagine, impedendo la necessità di scorrimento. DocumentViewer offre una soluzione per visualizzare il contenuto di FixedDocument, che usa lo scorrimento tradizionale per mostrare i contenuti fuori dal regno dell'area di visualizzazione.
Per altre informazioni sui formati di documento e sulle opzioni di presentazione, vedere Documenti in WPF.
Vedere anche
.NET Desktop feedback