Ottimizzazione delle prestazioni: controlli

Windows Presentation Foundation (WPF) include molti dei componenti comuni dell'interfaccia utente usati nella maggior parte delle applicazioni Windows. Questo argomento illustra le tecniche da adottare per migliorare le prestazioni dell'interfaccia utente.

Visualizzazione di set di dati di grandi dimensioni

I controlli WPF, ListView ad esempio e ComboBox , vengono usati per visualizzare elenchi di elementi in un'applicazione. Se l'elenco da visualizzare è molto lungo, le prestazioni dell'applicazione possono risentirne. Questo perché il sistema di layout standard crea un contenitore di layout per ogni elemento associato al controllo elenco e ne calcola le dimensioni di layout e la posizione. In genere, non è necessario visualizzare tutti gli elementi contemporaneamente, ma ne viene visualizzato un sottoinsieme e l'utente scorre l'elenco. In questo caso è utile usare 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 aspetto importante dei controlli elenco e non deve essere confusa con la virtualizzazione dei dati. Con la virtualizzazione dell'interfaccia utente vengono archiviati in memoria solo gli elementi visibili, mentre 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 visibili sullo schermo.

Per impostazione predefinita, la virtualizzazione dell'interfaccia utente è abilitata per i controlli e ListBox quando gli elementi dell'elenco ListView sono associati ai dati. TreeView la virtualizzazione può essere abilitata impostando la VirtualizingStackPanel.IsVirtualizing proprietà associata su true. Se si vuole abilitare la virtualizzazione dell'interfaccia utente per i controlli personalizzati che derivano da ItemsControl o da controlli elemento esistenti che usano la StackPanel classe , ad esempio ComboBox, è possibile impostare su VirtualizingStackPanelItemsPanel e impostare su IsVirtualizingtrue. Purtroppo è possibile che la virtualizzazione dell'interfaccia utente venga inavvertitamente disabilitata per questi controlli. Di seguito sono elencate le condizioni che disabilitano la virtualizzazione dell'interfaccia utente.

Un aspetto importante di cui tener conto quando si virtualizzano contenitori di elementi è la disponibilità di informazioni aggiuntive sullo stato associate a un contenitore di elementi appartenente all'elemento. Nel caso in cui queste informazioni siano disponibili, è necessario salvare lo stato aggiuntivo. Ad esempio, potrebbe essere presente un elemento contenuto in un Expander controllo e lo IsExpanded stato è associato al contenitore dell'elemento e non all'elemento stesso. Quando il contenitore viene riutilizzato per un nuovo elemento, il valore corrente di IsExpanded viene usato per il nuovo elemento. Inoltre, l'elemento precedente perde il valore corretto IsExpanded .

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

Riciclo del contenitore

Un'ottimizzazione per la virtualizzazione dell'interfaccia utente aggiunta in .NET Framework 3.5 SP1 per i controlli che ereditano da ItemsControl è il riciclo dei contenitori, che può anche migliorare le prestazioni di scorrimento. Quando un ItemsControl oggetto che usa la virtualizzazione dell'interfaccia utente viene popolato, crea un contenitore di elementi per ogni elemento che scorre nella visualizzazione e elimina definitivamente il contenitore di elementi per ogni elemento che scorre fuori dalla visualizzazione. Il riciclo dei contenitori consente al controllo di riutilizzare i contenitori di elementi esistenti per elementi di dati diversi, in modo che i contenitori di elementi non vengano creati ed eliminati definitivamente man mano che l'utente scorre .ItemsControl È possibile scegliere di abilitare il riciclo degli elementi impostando la VirtualizationMode proprietà associata su Recycling.

Qualsiasi ItemsControl elemento che supporta la virtualizzazione può usare il riciclo dei contenitori. Per un esempio di come abilitare il riciclo dei contenitori in un ListBox, vedere Migliorare le prestazioni di scorrimento di un controllo ListBox.

Supporto della virtualizzazione bidirezionale

VirtualizingStackPanel offre il supporto predefinito per la virtualizzazione dell'interfaccia utente in una direzione, orizzontalmente o verticalmente. Se si vuole usare la virtualizzazione bidirezionale per i controlli, è necessario implementare un pannello personalizzato che estende la VirtualizingStackPanel classe. La VirtualizingStackPanel classe espone metodi virtuali come OnViewportSizeChanged, LineUp, PageUpe MouseWheelUp. Questi metodi virtuali consentono di rilevare una modifica nella parte visibile di un elenco e gestirla di conseguenza.

Ottimizzazione dei modelli

La struttura ad albero visuale contiene tutti gli elementi visivi di un'applicazione. Oltre agli oggetti creati direttamente, contiene anche oggetti generati dall'espansione del modello. Ad esempio, quando si crea un Buttonoggetto , si ottengono ClassicBorderDecorator anche oggetti e ContentPresenter nella struttura ad albero visuale. Se non si è provveduto a ottimizzare i modelli di controllo, quindi, è possibile che si creino molti oggetti in più non necessari nella struttura ad albero visuale. Per altre informazioni sulla struttura ad albero visuale, vedere Cenni preliminari sul rendering della grafica WPF.

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, valutare la possibilità di usare lo scorrimento posticipato, in cui il contenuto viene aggiornato solo quando l'utente rilascia il cursore.

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

Controlli che implementano le funzionalità delle prestazioni

La tabella seguente elenca i controlli comuni per la visualizzazione dei dati e ne indica il tipo di supporto per le funzionalità relative alle prestazioni. Vedere le sezioni precedenti per informazioni su come abilitare queste funzionalità.

Controllo Virtualizzazione Riciclo del contenitore Scorrimento posticipato
ComboBox Può essere abilitato Può essere abilitato Può essere abilitato
ContextMenu Può essere abilitato Può essere abilitato Può essere abilitato
DocumentViewer Non disponibile Non disponibile Può essere abilitato
ListBox Default Può essere abilitato Può essere abilitato
ListView Default Può essere abilitato Può essere abilitato
TreeView Può essere abilitato Può essere abilitato Può essere abilitato
ToolBar Non disponibile Non disponibile Può essere abilitato

Nota

Per un esempio di come abilitare la virtualizzazione e il riciclo dei contenitori in un TreeViewoggetto , vedere Migliorare le prestazioni di un controllo TreeView.

Vedi anche