Ottimizzazione delle prestazioni: controlli

Aggiornamento: Luglio 2008

In Windows Presentation Foundation (WPF) sono inclusi molti dei componenti dell'interfaccia utente comuni utilizzati nella maggior parte delle applicazioni Windows. In questo argomento sono descritte le tecniche che consentono di migliorare le prestazioni dell'interfaccia utente.

Nel presente argomento sono contenute le seguenti sezioni.

  • Visualizzazione di set di dati di grandi dimensioni
  • Riciclo del contenitore
  • Supporto della virtualizzazione bidirezionale
  • Ottimizzazione dei modelli
  • Scorrimento posticipato
  • Controlli che implementano le funzioni relative alle prestazioni
  • Argomenti correlati

Visualizzazione di set di dati di grandi dimensioni

I controlli WPF, ad esempio ListView e ComboBox, vengono utilizzati per visualizzare elenchi di elementi in un'applicazione. Se l'elenco da visualizzare è molto lungo, le prestazioni dell'applicazione possono risentirne. Ciò è dovuto al fatto che il sistema di layout standard crea un contenitore di layout per ogni elemento associato al controllo elenco e ne calcola dimensioni di layout e posizione. Solitamente non è necessario visualizzare tutti gli elementi nello stesso tempo, ne viene invece visualizzato un sottoinsieme e l'utente scorre l'elenco. In questo caso è utile utilizzare la virtualizzazione dell'interfaccia utente, ovvero la generazione del contenitore dell'elemento e il calcolo del layout associato sono rinviati al momento in cui l'elemento risulta visibile.

La virtualizzazione dell'interfaccia utente è un importante aspetto dei controlli elenco. Non deve essere confusa con la virtualizzazione dei dati. Con la virtualizzazione dell'interfaccia utente solo gli elementi visibili sono archiviati in memoria ma in uno scenario di associazione dati viene archiviata in memoria l'intera struttura dei dati. Con la virtualizzazione dei dati, al contrario, vengono archiviati in memoria solo gli elementi dati che sono visibili sullo schermo.

Per impostazione predefinita, la virtualizzazione dell'interfaccia utente è attivata per i controlli ListView e ListBox quando i relativi elementi elenco sono associati a dati. La virtualizzazione di TreeView può essere attivata impostando la proprietà associata VirtualizingStackPanel.IsVirtualizing su true. Se si desidera attivare la virtualizzazione dell'interfaccia utente per controlli personalizzati che derivano da ItemsControl o per controlli di elementi esistenti che utilizzano la classe StackPanel, ad esempio ComboBox, è possibile impostare la proprietà ItemsPanel su VirtualizingStackPanel e impostare IsVirtualizing su true. Purtroppo è possibile disattivare inavvertitamente la virtualizzazione dell'interfaccia utente per questi controlli. Nell'elenco seguente vengono indicate le condizioni in grado di disattivare la virtualizzazione dell'interfaccia utente.

Attualmente nessun controllo WPF presenta supporto incorporato per la virtualizzazione dei dati.

Riciclo del contenitore

Un'ottimizzazione della virtualizzazione dell'interfaccia utente aggiunta in .NET Framework 3.5 SP1 per controlli che ereditano da ItemsControl è il riciclo del contenitore, in grado di migliorare anche l'operazione di scorrimento. Quando viene popolato un oggetto ItemsControl che utilizza la virtualizzazione dell'interfaccia utente, per ogni elemento visualizzato viene creato un contenitore mentre per ogni elemento che scompare dalla visualizzazione il contenitore relativo viene distrutto. Il riciclo del contenitore consente al controllo di riutilizzare i contenitori esistenti per i vari elementi dati, di modo che i contenitori non vengano continuamente creati e distrutti man mano che l'utente scorre ItemsControl. È possibile attivare il riciclo degli elementi impostando VirtualizationMode su Recycling.

Il riciclo del contenitore non viene utilizzato se una delle condizioni seguenti è vera:

Quando si riciclano i contenitori di elementi è importante prendere in considerazione la disponibilità di informazioni sullo stato aggiuntive associate a un contenitore di elementi che appartengono all'elemento. In questo caso è necessario salvare lo stato aggiuntivo. Si potrebbe disporre, ad esempio, di un elemento contenuto in un controllo Expander e lo stato IsExpanded è associato al contenitore dell'elemento, non all'elemento stesso. Quando il contenitore viene riutilizzato per un nuovo elemento, il valore corrente di IsExpanded viene utilizzato per il nuovo elemento. L'elemento precedente, inoltre, perde il valore IsExpanded corretto.

Qualsiasi oggetto ItemsControl che supporta la virtualizzazione può utilizzare il riciclo del contenitore. Per un esempio di come attivare il riciclo del contenitore in un oggetto ListBox, vedere Procedura: migliorare le prestazioni di scorrimento di un controllo ListBox.

Supporto della virtualizzazione bidirezionale

VirtualizingStackPanel offre supporto incorporato per la virtualizzazione dell'interfaccia utente in una direzione, in senso orizzontale o verticale. Se per i controlli si desidera utilizzare la virtualizzazione bidirezionale, è necessario implementare un pannello personalizzato che estende la classe VirtualizingStackPanel. La classe VirtualizingStackPanel espone metodi virtuali, ad esempio OnViewportSizeChanged, LineUp, PageUp e MouseWheelUp. Tali metodi virtuali consentono di rilevare una modifica nella parte visibile di un elenco e di affrontarla di conseguenza.

Ottimizzazione dei modelli

La struttura ad albero visuale contiene tutti gli elementi visivi di un'applicazione. Oltre agli oggetti creati direttamente, contiene inoltre oggetti dovuti all'espansione del modello. Quando ad esempio si crea un oggetto Button, si ottengono anche oggetti ClassicBorderDecorator e ContentPresenter nella struttura ad albero visuale. Se non si è provveduto a ottimizzare i modelli di controllo, è possibile che si creino molti oggetti in più non necessari nella struttura ad albero visuale. È possibile utilizzare XAMLPad per tenere traccia degli elementi presenti nella struttura ad albero visuale e rimuovere dai modelli gli elementi non necessari quando possibile. Per ulteriori informazioni sulla struttura ad albero visuale, vedere Cenni preliminari sul rendering della grafica in Windows Presentation Foundation.

Scorrimento posticipato

Per impostazione predefinita quando l'utente trascina il cursore su una barra di scorrimento, la visualizzazione del contenuto viene continuamente aggiornata. Se lo scorrimento è lento nel controllo, prendere in considerazione lo scorrimento posticipato. In tal caso il contenuto viene aggiornato solo quando l'utente rilascia il cursore.

Per implementare lo scorrimento posticipato, impostare la proprietà IsDeferredScrollingEnabled su true. IsDeferredScrollingEnabled è una proprietà associata che può essere impostata in ScrollViewer e in qualsiasi controllo che dispone di ScrollViewer nel relativo modello.

Controlli che implementano le funzioni relative alle prestazioni

Nella tabella seguente sono elencati i controlli comuni per la visualizzazione dei dati e il rispettivo supporto delle funzionalità relative alle prestazioni. Vedere le sezioni precedenti per informazioni sull'attivazione di queste funzionalità.

Control

Virtualizzazione

Riciclo del contenitore

Scorrimento posticipato

ComboBox

Può essere attivato

Può essere attivato

Può essere attivato

ContextMenu

Può essere attivato

Può essere attivato

Può essere attivato

DocumentViewer

Non disponibile

Non disponibile

Può essere attivato

ListBox

Default

Può essere attivato

Può essere attivato

ListView

Default

Può essere attivato

Può essere attivato

TreeView

Può essere attivato

Può essere attivato

Può essere attivato

ToolBar

Non disponibile

Non disponibile

Può essere attivato

Nota

Per un esempio di come attivare la virtualizzazione e il riciclo del contenitore in un oggetto TreeView, vedere Procedura: migliorare le prestazioni di un controllo TreeView.

Vedere anche

Concetti

Sistema di layout

Ottimizzazione delle prestazioni: layout e progettazione

Ottimizzazione delle prestazioni: associazione dati

Cenni preliminari sui controlli

Applicazione di stili e modelli

Cronologia delle modifiche

Date

History

Motivo

Luglio 2008

Argomento aggiunto per .NET Framework 3.5 Service Pack 1.

Modifica di funzionalità in SP1.