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.
I contenitori di elementi vengono aggiunti direttamente a ItemsControl. Se ad esempio in un'applicazione vengono aggiunti in modo esplicito oggetti ListBoxItem a un controllo ListBox, ListBox non virtualizza gli oggetti ListBoxItem. Per ulteriori informazioni sui contenitori di elementi, vedere la sezione relativa ad ItemsControl in Cenni preliminari sul modello di contenuto dei controlli.
Impostazione di CanContentScroll su false.
Impostazione di IsVirtualizing su false.
Utilizzo del raggruppamento di elementi.
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:
I contenitori di elementi vengono aggiunti direttamente a ItemsControl, ad esempio quando gli oggetti ListBoxItem sono aggiunti direttamente a un controllo ListBox. Per ulteriori informazioni sui contenitori di elementi, vedere la sezione relativa ad ItemsControl in Cenni preliminari sul modello di contenuto dei controlli.
I contenitori di elementi in ItemsControl sono di tipi diversi. Un oggetto Menu, ad esempio, che utilizza oggetti Separator non può implementare il riciclo degli elementi perché Menu contiene oggetti di tipo Separator e MenuItem.
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 |
---|---|---|---|
Può essere attivato |
Può essere attivato |
Può essere attivato |
|
Può essere attivato |
Può essere attivato |
Può essere attivato |
|
Non disponibile |
Non disponibile |
Può essere attivato |
|
Default |
Può essere attivato |
Può essere attivato |
|
Default |
Può essere attivato |
Può essere attivato |
|
Può essere attivato |
Può essere attivato |
Può essere attivato |
|
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
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. |