Ottimizzazione delle prestazioni: controlliOptimizing performance: Controls

Windows Presentation Foundation (WPF) include molti componenti dell'interfaccia utente comuni utilizzati nella maggior parte delle applicazioni Windows.Windows Presentation Foundation (WPF) includes many of the common user-interface (UI) components that are used in most Windows applications. Questo argomento illustra le tecniche da adottare per migliorare le prestazioni dell'interfaccia utente.This topic contains techniques for improving the performance of your UI.

Visualizzazione di set di dati di grandi dimensioniDisplaying large data sets

Per visualizzare elenchi di elementi in un'applicazione, vengono utilizzati controlli WPF come ListView e ComboBox.WPF controls such as the ListView and ComboBox are used to display lists of items in an application. Se l'elenco da visualizzare è molto lungo, le prestazioni dell'applicazione possono risentirne.If the list to display is large, the application's performance can be affected. 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.This is because the standard layout system creates a layout container for each item associated with the list control, and computes its layout size and position. In genere, non è necessario visualizzare tutti gli elementi contemporaneamente, ma ne viene visualizzato un sottoinsieme e l'utente scorre l'elenco.Typically, you do not have to display all the items at the same time; instead you display a subset, and the user scrolls through the list. 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.In this case, it makes sense to use UI virtualization, which means the item container generation and associated layout computation for an item is deferred until the item is visible.

La virtualizzazione dell'interfaccia utente è un aspetto importante dei controlli elencoUI Virtualization is an important aspect of list controls. e non deve essere confusa con la virtualizzazione dei dati.UI virtualization should not be confused with data virtualization. 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.UI virtualization stores only visible items in memory but in a data-binding scenario stores the entire data structure in memory. Con la virtualizzazione dei dati, al contrario, vengono archiviati in memoria solo gli elementi dati visibili sullo schermo.In contrast, data virtualization stores only the data items that are visible on the screen in memory.

Per impostazione predefinita, la virtualizzazione dell'interfaccia utente è abilitata per i controlli ListView e ListBox quando i relativi elementi elenco sono associati ai dati.By default, UI virtualization is enabled for the ListView and ListBox controls when their list items are bound to data. TreeView virtualizzazione può essere abilitata impostando la proprietà associata VirtualizingStackPanel.IsVirtualizing su true.TreeView virtualization can be enabled by setting the VirtualizingStackPanel.IsVirtualizing attached property to 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 il ItemsPanel su VirtualizingStackPanel e impostare IsVirtualizing su true.If you want to enable UI virtualization for custom controls that derive from ItemsControl or existing item controls that use the StackPanel class, such as ComboBox, you can set the ItemsPanel to VirtualizingStackPanel and set IsVirtualizing to true. Purtroppo è possibile che la virtualizzazione dell'interfaccia utente venga inavvertitamente disabilitata per questi controlli.Unfortunately, you can disable UI virtualization for these controls without realizing it. Di seguito sono elencate le condizioni che disabilitano la virtualizzazione dell'interfaccia utente.The following is a list of conditions that disable UI virtualization.

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.An important consideration when you virtualize item containers is whether you have additional state information associated with an item container that belongs with the item. Nel caso in cui queste informazioni siano disponibili, è necessario salvare lo stato aggiuntivo.In this case, you must save the additional state. Ad esempio, si potrebbe avere un elemento contenuto in un controllo Expander e lo stato IsExpanded è associato al contenitore dell'elemento e non all'elemento stesso.For example, you might have an item contained in an Expander control and the IsExpanded state is bound to the item's container, and not to the item itself. Quando il contenitore viene riutilizzato per un nuovo elemento, viene utilizzato il valore corrente di IsExpanded per il nuovo elemento.When the container is reused for a new item, the current value of IsExpanded is used for the new item. Inoltre, l'elemento precedente perde il valore IsExpanded corretto.In addition, the old item loses the correct IsExpanded value.

Attualmente nessun controllo WPF offre il supporto incorporato per la virtualizzazione dei dati.Currently, no WPF controls offer built-in support for data virtualization.

Riciclo del contenitoreContainer recycling

Un'ottimizzazione per la virtualizzazione dell'interfaccia utente aggiunta in .NET Framework 3,5 SP1 per i controlli che ereditano da ItemsControl è il riciclo del contenitore, che può anche migliorare le prestazioni di scorrimento.An optimization to UI virtualization added in the .NET Framework 3.5 SP1 for controls that inherit from ItemsControl is container recycling, which can also improve scrolling performance. Quando viene popolato un ItemsControl che usa la virtualizzazione dell'interfaccia utente, viene creato un contenitore di elementi per ogni elemento che scorre nella visualizzazione ed Elimina il contenitore di elementi per ogni elemento che scorre fuori dalla visualizzazione.When an ItemsControl that uses UI virtualization is populated, it creates an item container for each item that scrolls into view and destroys the item container for each item that scrolls out of view. Il riciclo del contenitore 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 continuamente quando l'utente scorre il ItemsControl.Container recycling enables the control to reuse the existing item containers for different data items, so that item containers are not constantly created and destroyed as the user scrolls the ItemsControl. È possibile scegliere di abilitare il riciclo degli elementi impostando la proprietà associata VirtualizationMode su Recycling.You can choose to enable item recycling by setting the VirtualizationMode attached property to Recycling.

Eventuali ItemsControl che supportano la virtualizzazione possono usare il riciclo dei contenitori.Any ItemsControl that supports virtualization can use container recycling. Per un esempio di come abilitare il riciclo del contenitore in un ListBox, vedere migliorare le prestazioni di scorrimento di un controllo ListBox.For an example of how to enable container recycling on a ListBox, see Improve the Scrolling Performance of a ListBox.

Supporto della virtualizzazione bidirezionaleSupporting bidirectional virtualization

VirtualizingStackPanel offre supporto incorporato per la virtualizzazione dell'interfaccia utente in una direzione, orizzontalmente o verticalmente.VirtualizingStackPanel offers built-in support for UI virtualization in one direction, either horizontally or vertically. Se si vuole usare la virtualizzazione bidirezionale per i controlli, è necessario implementare un pannello personalizzato che estende la classe VirtualizingStackPanel.If you want to use bidirectional virtualization for your controls, you must implement a custom panel that extends the VirtualizingStackPanel class. La classe VirtualizingStackPanel espone metodi virtuali come OnViewportSizeChanged, LineUp, PageUpe MouseWheelUp. Questi metodi virtuali consentono di rilevare una modifica nella parte visibile di un elenco e di gestirla di conseguenza.The VirtualizingStackPanel class exposes virtual methods such as OnViewportSizeChanged, LineUp, PageUp, and MouseWheelUp.These virtual methods enable you to detect a change in the visible part of a list and handle it accordingly.

Ottimizzazione di modelliOptimizing templates

La struttura ad albero visuale contiene tutti gli elementi visivi di un'applicazione.The visual tree contains all the visual elements in an application. Oltre agli oggetti creati direttamente, contiene anche oggetti generati dall'espansione del modello.In addition to the objects directly created, it also contains objects due to template expansion. Ad esempio, quando si crea una Button, si ottengono anche ClassicBorderDecorator e ContentPresenter oggetti nella struttura ad albero visuale.For example, when you create a Button, you also get ClassicBorderDecorator and ContentPresenter objects in the visual tree. 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.If you haven't optimized your control templates, you may be creating a lot of extra unnecessary objects in the visual tree. Per altre informazioni sulla struttura ad albero visuale, vedere Cenni preliminari sul rendering della grafica WPF.For more information on the visual tree, see WPF Graphics Rendering Overview.

Scorrimento posticipatoDeferred scrolling

Per impostazione predefinita, quando l'utente trascina il cursore su una barra di scorrimento, la visualizzazione del contenuto viene continuamente aggiornata.By default, when the user drags the thumb on a scrollbar, the content view continuously updates. Se lo scorrimento è lento nel controllo, valutare la possibilità di usare lo scorrimento posticipato,If scrolling is slow in your control, consider using deferred scrolling. in cui il contenuto viene aggiornato solo quando l'utente rilascia il cursore.In deferred scrolling, the content is updated only when the user releases the thumb.

Per implementare lo scorrimento posticipato, impostare la proprietà IsDeferredScrollingEnabled su true.To implement deferred scrolling, set the IsDeferredScrollingEnabled property to true. IsDeferredScrollingEnabled è una proprietà associata e può essere impostata su ScrollViewer e qualsiasi controllo con un ScrollViewer nel relativo modello di controllo.IsDeferredScrollingEnabled is an attached property and can be set on ScrollViewer and any control that has a ScrollViewer in its control template.

Controlli che implementano le funzionalità delle prestazioniControls that implement performance features

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.The following table lists the common controls for displaying data and their support of performance features. Vedere le sezioni precedenti per informazioni su come abilitare queste funzionalità.See the previous sections for information on how to enable these features.

ControlControl VirtualizzazioneVirtualization Riciclo del contenitoreContainer recycling Scorrimento posticipatoDeferred scrolling
ComboBox Può essere abilitatoCan be enabled Può essere abilitatoCan be enabled Può essere abilitatoCan be enabled
ContextMenu Può essere abilitatoCan be enabled Può essere abilitatoCan be enabled Può essere abilitatoCan be enabled
DocumentViewer Non disponibileNot available Non disponibileNot available Può essere abilitatoCan be enabled
ListBox Impostazione predefinitaDefault Può essere abilitatoCan be enabled Può essere abilitatoCan be enabled
ListView Impostazione predefinitaDefault Può essere abilitatoCan be enabled Può essere abilitatoCan be enabled
TreeView Può essere abilitatoCan be enabled Può essere abilitatoCan be enabled Può essere abilitatoCan be enabled
ToolBar Non disponibileNot available Non disponibileNot available Può essere abilitatoCan be enabled

Nota

Per un esempio di come abilitare la virtualizzazione e il riciclo del contenitore in un TreeView, vedere migliorare le prestazioni di un controllo TreeView.For an example of how to enable virtualization and container recycling on a TreeView, see Improve the Performance of a TreeView.

Vedere ancheSee also