Condividi tramite


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 contiene tecniche 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 è grande, le prestazioni dell'applicazione possono essere influenzate. Questo avviene perché il sistema di layout standard crea un contenitore di layout per ogni elemento associato al controllo elenco e calcola le dimensioni e la posizione del layout. In genere, non è necessario visualizzare tutti gli elementi contemporaneamente; Viene invece visualizzato un subset e l'utente scorre l'elenco. In questo caso, è opportuno usare la virtualizzazione dell'interfaccia utente, ovvero la generazione di contenitori di elementi e il calcolo del layout associato per un elemento viene posticipato fino a quando l'elemento non è visibile.

La virtualizzazione dell'interfaccia utente è un aspetto importante dei controlli sulle liste. La virtualizzazione dell'interfaccia utente non deve essere confusa con la virtualizzazione dei dati. La virtualizzazione dell'interfaccia utente archivia solo gli elementi visibili in memoria, ma in uno scenario di data binding archivia l'intera struttura di dati in memoria. Al contrario, la virtualizzazione dei dati archivia solo gli elementi di dati visibili sullo schermo in memoria.

Per impostazione predefinita, la virtualizzazione dell'interfaccia utente è abilitata per i controlli ListView e ListBox quando i loro elementi dell'elenco 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 classe StackPanel, ad esempio ComboBox, è possibile impostare ItemsPanel su VirtualizingStackPanel e impostare IsVirtualizing su true. Sfortunatamente, puoi disabilitare la virtualizzazione dell'interfaccia utente per questi controlli senza renderlo conto. Di seguito è riportato un elenco di condizioni che disabilitano la virtualizzazione dell'interfaccia utente.

Una considerazione importante quando si virtualizzano i contenitori di elementi è se si dispone di informazioni aggiuntive sullo stato associate a un contenitore di elementi che appartiene all'elemento. In questo caso, è 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 supporto predefinito per la virtualizzazione dei dati.

Riciclo dei contenitori

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 attivare il riciclo dei contenitori su 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 a causa dell'espansione del modello. Ad esempio, quando si crea un Buttonoggetto, si ottengono anche gli oggetti ClassicBorderDecorator e ContentPresenter nella struttura ad albero visuale. Se i modelli di controllo non sono stati ottimizzati, è possibile creare molti oggetti aggiuntivi 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 pollice su una barra di scorrimento, la visualizzazione contenuto viene aggiornata continuamente. Se lo scorrimento è lento nel tuo controllo, considera l'uso dello scorrimento posticipato. Durante lo scorrimento posticipato, 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

Nella tabella seguente sono elencati i controlli comuni per la visualizzazione dei dati e il relativo supporto delle funzionalità delle prestazioni. Per informazioni su come abilitare queste funzionalità, vedere le sezioni precedenti.

Controllo Virtualizzazione Riciclo dei contenitori 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 Predefinito Può essere abilitato Può essere abilitato
ListView Predefinito Può essere abilitato Può essere abilitato
TreeView Può essere abilitato Può essere abilitato Può essere abilitato
ToolBar Non disponibile Non disponibile Può essere abilitato

Annotazioni

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

Vedere anche