Optimizar el rendimiento: ControlesOptimizing performance: Controls

Windows Presentation Foundation (WPF) incluye muchos de los componentes de interfaz de usuario (UI) comunes que se usan en la mayoría de las aplicaciones de Windows.Windows Presentation Foundation (WPF) includes many of the common user-interface (UI) components that are used in most Windows applications. Este tema contiene técnicas para mejorar el rendimiento de la interfaz de usuario.This topic contains techniques for improving the performance of your UI.

Mostrar grandes conjuntos de datosDisplaying large data sets

Los controles de WPF, como el ListView y ComboBox se usan para mostrar listas de elementos en una aplicación.WPF controls such as the ListView and ComboBox are used to display lists of items in an application. Si la lista para mostrar es grande, el rendimiento de la aplicación puede verse afectado.If the list to display is large, the application's performance can be affected. Esto ocurre porque el sistema de diseño estándar crea un contenedor de diseño para cada elemento asociado al control de lista y calcula el tamaño del diseño y la posición.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. Normalmente, no es necesario mostrar todos los elementos al mismo tiempo; en su lugar, muestra un subconjunto y el usuario se desplaza por la lista.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. En este caso, tiene sentido usar la virtualización de la interfaz de usuario, que significa que la generación de contenedores de elementos y el cálculo de diseño asociado para un elemento se aplaza hasta que el elemento es visible.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 virtualización de la interfaz de usuario es un aspecto importante de los controles de lista.UI Virtualization is an important aspect of list controls. No se debe confundir la virtualización de la interfaz de usuario con la virtualización de datos.UI virtualization should not be confused with data virtualization. La virtualización de la interfaz de imagen solo almacena elementos visibles en la memoria, pero, en un escenario de enlace de datos, almacena toda la estructura de datos en la memoria.UI virtualization stores only visible items in memory but in a data-binding scenario stores the entire data structure in memory. En cambio, la virtualización de datos solo almacena en la memoria los elementos de datos que están visibles en pantalla.In contrast, data virtualization stores only the data items that are visible on the screen in memory.

De forma predeterminada, está habilitada la virtualización de interfaz de usuario para el ListView y ListBox controla cuando sus elementos de lista están enlazados a datos.By default, UI virtualization is enabled for the ListView and ListBox controls when their list items are bound to data. TreeView la virtualización puede ser habilitada configurando el VirtualizingStackPanel.IsVirtualizing propiedad adjunta true.TreeView virtualization can be enabled by setting the VirtualizingStackPanel.IsVirtualizing attached property to true. Si desea habilitar la virtualización de interfaz de usuario para controles personalizados que derivan de ItemsControl o controles de elementos existentes que usan el StackPanel clase, como ComboBox, puede establecer el ItemsPanel a VirtualizingStackPanel y establecer IsVirtualizing a 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. Desgraciadamente, puede deshabilitar la virtualización de la interfaz de usuario para estos controles sin darse cuenta.Unfortunately, you can disable UI virtualization for these controls without realizing it. En la siguiente lista, se muestran las condiciones que deshabilitan la virtualización de la interfaz de usuario.The following is a list of conditions that disable UI virtualization.

Una consideración importante que se debe tener en cuenta al virtualizar contenedores de elementos es si tiene información adicional de estado asociada a un contenedor de elemento que pertenece al 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. Si es el caso, debe guardar el estado adicional.In this case, you must save the additional state. Por ejemplo, podría tener un elemento de un Expander control y el IsExpanded estado está enlazado al contenedor del elemento y no al propio elemento.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. Cuando se vuelve a usar el contenedor para un elemento nuevo, el valor actual de IsExpanded se usa para el nuevo elemento.When the container is reused for a new item, the current value of IsExpanded is used for the new item. Además, el elemento antiguo perderá el valor correcto IsExpanded valor.In addition, the old item loses the correct IsExpanded value.

Actualmente, ningún control WPF ofrece compatibilidad integrada para la virtualización de datos.Currently, no WPF controls offer built-in support for data virtualization.

Reciclaje de contenedoresContainer recycling

Una optimización a la virtualización de la interfaz de usuario que agregó en .NET Framework 3.5 SP1 para los controles que heredan de ItemsControl es reciclaje de contenedores, también que puede mejorar el rendimiento del desplazamiento.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. Cuando un ItemsControl que utiliza virtualización de interfaz de usuario se rellena, crea un contenedor de elementos para cada elemento que se desplaza en la vista y destruye el contenedor de elementos para cada elemento que se desplaza fuera de la vista.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. Reciclaje de contenedores permite reutilizar los contenedores de elementos existentes para elementos de datos diferentes, por lo que los contenedores de elementos no constantemente se crean y destruyen como el usuario se desplaza al control el 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. Puede elegir habilitar el elemento reciclaje estableciendo el VirtualizationMode propiedad adjunta Recycling.You can choose to enable item recycling by setting the VirtualizationMode attached property to Recycling.

Cualquier ItemsControl que admite la virtualización puede usar el reciclaje de contenedores.Any ItemsControl that supports virtualization can use container recycling. Para obtener un ejemplo de cómo habilitar el reciclaje de contenedores en un ListBox, consulte mejorar el rendimiento del desplazamiento de un control ListBox.For an example of how to enable container recycling on a ListBox, see Improve the Scrolling Performance of a ListBox.

Compatibilidad con la virtualización bidireccionalSupporting bidirectional virtualization

VirtualizingStackPanel ofrece compatibilidad integrada para la virtualización de interfaz de usuario en una dirección, ya sea horizontal o verticalmente.VirtualizingStackPanel offers built-in support for UI virtualization in one direction, either horizontally or vertically. Si desea usar la virtualización bidireccional para sus controles, debe implementar un panel personalizado que extiende el VirtualizingStackPanel clase.If you want to use bidirectional virtualization for your controls, you must implement a custom panel that extends the VirtualizingStackPanel class. El VirtualizingStackPanel clase expone los métodos virtuales como OnViewportSizeChanged, LineUp, PageUp, y MouseWheelUp. Estos métodos virtuales permiten detectar un cambio en la parte visible de una lista y controlarlo en consecuencia.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.

Optimizar plantillasOptimizing templates

El árbol visual contiene todos los elementos visuales de una aplicación.The visual tree contains all the visual elements in an application. Además de los objetos que se crean directamente, también contiene objetos debidos a la expansión de plantilla.In addition to the objects directly created, it also contains objects due to template expansion. Por ejemplo, cuando se crea un Button, también obtendrá ClassicBorderDecorator y ContentPresenter objetos en el árbol visual.For example, when you create a Button, you also get ClassicBorderDecorator and ContentPresenter objects in the visual tree. Si no ha optimizado las plantillas de control, puede crear una gran cantidad de objetos innecesarios adicionales en el árbol visual.If you haven't optimized your control templates, you may be creating a lot of extra unnecessary objects in the visual tree. Para obtener más información sobre el árbol visual, consulte Información general sobre la representación de gráficos en WPF.For more information on the visual tree, see WPF Graphics Rendering Overview.

Desplazamiento diferidoDeferred scrolling

De forma predeterminada, cuando el usuario arrastra el control de posición en una barra de desplazamiento, la vista de contenido se actualiza continuamente.By default, when the user drags the thumb on a scrollbar, the content view continuously updates. Si el desplazamiento es lento en el control, considere la posibilidad de usar el desplazamiento diferido.If scrolling is slow in your control, consider using deferred scrolling. En el desplazamiento diferido, el contenido se actualiza solo cuando el usuario suelta el control de posición.In deferred scrolling, the content is updated only when the user releases the thumb.

Para implementar el desplazamiento diferido, establezca el IsDeferredScrollingEnabled propiedad true.To implement deferred scrolling, set the IsDeferredScrollingEnabled property to true. IsDeferredScrollingEnabled es una propiedad adjunta y se puede establecer en ScrollViewer y cualquier control que tenga un ScrollViewer en su plantilla de control.IsDeferredScrollingEnabled is an attached property and can be set on ScrollViewer and any control that has a ScrollViewer in its control template.

Controles que implementan características de rendimientoControls that implement performance features

En la tabla siguiente, se enumeran los controles comunes para mostrar datos y su compatibilidad con las características de rendimiento.The following table lists the common controls for displaying data and their support of performance features. Consulte las secciones anteriores para obtener información sobre cómo habilitar estas características.See the previous sections for information on how to enable these features.

ControlControl VirtualizaciónVirtualization Reciclaje de contenedoresContainer recycling Desplazamiento diferidoDeferred scrolling
ComboBox Se puede habilitar.Can be enabled Se puede habilitar.Can be enabled Se puede habilitar.Can be enabled
ContextMenu Se puede habilitar.Can be enabled Se puede habilitar.Can be enabled Se puede habilitar.Can be enabled
DocumentViewer No disponibleNot available No disponibleNot available Se puede habilitar.Can be enabled
ListBox DefaultDefault Se puede habilitar.Can be enabled Se puede habilitar.Can be enabled
ListView DefaultDefault Se puede habilitar.Can be enabled Se puede habilitar.Can be enabled
TreeView Se puede habilitar.Can be enabled Se puede habilitar.Can be enabled Se puede habilitar.Can be enabled
ToolBar No disponibleNot available No disponibleNot available Se puede habilitar.Can be enabled

Nota

Para obtener un ejemplo de cómo habilitar la virtualización y reciclaje de contenedores en un TreeView, consulte mejorar el rendimiento de un control TreeView.For an example of how to enable virtualization and container recycling on a TreeView, see Improve the Performance of a TreeView.

Vea tambiénSee also