Compartir a través de


Optimizar el rendimiento: Controles

Actualización: Julio de 2008

Windows Presentation Foundation (WPF) incluye muchos de los componentes comunes de interfaz de usuario que se utilizan en la mayoría de las aplicaciones para Windows. Este tema contiene técnicas para mejorar el rendimiento de la interfaz de usuario.

Este tema contiene las secciones siguientes.

  • Mostrar conjuntos de datos de gran tamaño
  • Reciclaje de contenedores
  • Compatibilidad con la virtualización bidireccional
  • Optimizar plantillas
  • Desplazamiento diferido
  • Controles que implementan características de rendimiento
  • Temas relacionados

Mostrar conjuntos de datos de gran tamaño

Los controles de WPF como ListView y ComboBox se utilizan para mostrar listas de elementos en una aplicación. Si la lista que se va a mostrar es grande, puede afectar al rendimiento de la aplicación. Esto es porque el sistema de diseño estándar crea un contenedor de diseño para cada elemento asociado al control de lista, y calcula su tamaño y posición de diseño. Normalmente, no es necesario mostrar al mismo tiempo todos los elementos; en lugar de ello se muestra un subconjunto y el usuario se va desplazando por la lista. En este caso, es razonable utilizar la virtualización de la interfaz de usuario, que consiste en diferir la generación de contenedor de elemento y los cálculos de diseño asociados hasta que el elemento esté visible.

La virtualización de la interfaz de usuario es un aspecto importante de los controles de lista. Es importante no confundir la virtualización de la interfaz de usuario con la virtualización de datos. La virtualización de la interfaz de usuario almacena en la memoria únicamente los elementos visibles; pero en un escenario de enlace de datos almacena en la memoria la estructura de datos completa. En cambio, la virtualización de datos almacena en la memoria solamente los elementos de datos que están visibles en la pantalla.

De forma predeterminada, la virtualización de la interfaz de usuario está habilitada para los controles ListBox y ListView cuando sus elementos de lista están enlazados a datos. La virtualización de TreeView puede habilitarse estableciendo la propiedad asociada VirtualizingStackPanel.IsVirtualizing en true. Si desea habilitar la virtualización de la interfaz de usuario para los controles personalizados derivados de ItemsControl o de controles de elementos existentes que utilizan la clase StackPanel, como ComboBox, puede establecer ItemsPanel en VirtualizingStackPanel y establecer IsVirtualizing en true. Desgraciadamente, puede suceder que deshabilite la virtualización de la interfaz de usuario para estos controles sin darse cuenta. A continuación se facilita una lista de condiciones que deshabilitan la virtualización de la interfaz de usuario.

Actualmente, ningún control de WPF proporciona compatibilidad integrada con la virtualización de datos.

Reciclaje de contenedores

Una optimización a la virtualización de la interfaz de usuario que se ha agregado a .NET Framework 3.5 SP1 para los controles que heredan de ItemsControl es el reciclaje de contenedores, que también puede mejorar el rendimiento del desplazamiento. Cuando se rellena un objeto ItemsControl que utiliza la virtualización de la interfaz de usuario, crea un contenedor de elemento para cada elemento que queda visible al desplazarse, y destruye el contenedor de elemento correspondiente a cada elemento que deja de estar visible al desplazarse. El reciclaje de contenedores permite que el control reutilice los contenedores de elemento existentes para distintos elementos de datos, de tal forma que evita tener que crear y destruir continuamente los contenedores de elementos a medida que usuario se desplaza por ItemsControl. Si lo desea, puede habilitar el reciclaje de elementos estableciendo VirtualizationMode en Recycling.

El reciclaje de contenedores no se utiliza si se cumple cualquiera de los casos siguientes:

Al reciclar contenedores de elementos, es importante tener en cuenta la existencia de información de estado adicional correspondiente al elemento que está asociada al contenedor de ese elemento. En este caso, deberá guardar el estado adicional. Por ejemplo, supongamos que hay un elemento incluido en un control Expander y que el estado IsExpanded está enlazado al contenedor del elemento, no al propio elemento. Cuando el contenedor se reutiliza para un nuevo elemento, el valor actual de IsExpanded se utiliza para el nuevo elemento. Además, el elemento antiguo pierde el valor de IsExpanded correcto.

Cualquier objeto ItemsControl que admita la virtualización puede utilizar el reciclaje de contenedores. Para obtener un ejemplo de cómo habilitar el reciclaje de contenedores en un control ListBox, vea Cómo: Mejorar el rendimiento del desplazamiento de un control ListBox.

Compatibilidad con la virtualización bidireccional

VirtualizingStackPanel proporciona compatibilidad integrada con la virtualización de la interfaz de usuario en una dirección, horizontal o vertical. Si desea utilizar la virtualización bidireccional para sus controles, debe implementar un panel personalizado que extienda la clase VirtualizingStackPanel. La clase VirtualizingStackPanel expone 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 administrarlo en consecuencia.

Optimizar plantillas

El árbol visual contiene todos los elementos visuales de una aplicación. Además de los objetos que se han creado directamente, también contiene los que se deben a la expansión de la plantilla. Por ejemplo, al crear un objeto Button, también se obtienen los objetos ContentPresenter y ClassicBorderDecorator en el árbol visual. Si no ha optimizado las plantillas de los controles, puede suceder que cree gran cantidad de objetos innecesarios adicionales en el árbol visual. Puede utilizar XAMLPad para realizar el seguimiento de los elementos del árbol visual y quitar aquellos que sean innecesarios de las plantillas siempre que sea posible. Para obtener más información sobre el árbol visual, vea Información general sobre la representación de gráficos en Windows Presentation Foundation.

Desplazamiento diferido

De forma predeterminada, cuando el usuario arrastra el cuadro de una barra de desplazamiento, la vista de contenido se actualiza continuamente. Si el desplazamiento dentro del control es lento, puede ser interesante utilizar el desplazamiento diferido. En el desplazamiento diferido, el contenido se actualiza únicamente cuando el usuario suelta el cuadro de desplazamiento.

Para implementar el desplazamiento diferido, establezca la propiedad IsDeferredScrollingEnabled en true. IsDeferredScrollingEnabled es una propiedad asociada y se puede establecer para ScrollViewer y para cualquier control que contenga ScrollViewer en su plantilla de control.

Controles que implementan características de rendimiento

En la tabla siguiente se muestra una lista de controles que se suelen usar para mostrar datos y su compatibilidad con las características de rendimiento. Vea las secciones anteriores para obtener información sobre cómo habilitar estas características.

Control

Virtualización

Reciclaje de contenedores

Desplazamiento diferido

ComboBox

Se puede habilitar

Se puede habilitar

Se puede habilitar

ContextMenu

Se puede habilitar

Se puede habilitar

Se puede habilitar

DocumentViewer

No está disponible

No está disponible

Se puede habilitar

ListBox

Opción predeterminada

Se puede habilitar

Se puede habilitar

ListView

Opción predeterminada

Se puede habilitar

Se puede habilitar

TreeView

Se puede habilitar

Se puede habilitar

Se puede habilitar

ToolBar

No está disponible

No está disponible

Se puede habilitar

Nota

Para obtener un ejemplo de cómo habilitar virtualización y reciclaje del contenedores en un objeto TreeView, vea Cómo: Mejorar el rendimiento de un control TreeView.

Vea también

Conceptos

Sistema de diseño

Optimizar el rendimiento: Presentación y diseño

Optimizar el rendimiento: Enlace de datos

Información general sobre controles

Aplicar estilos y plantillas

Historial de cambios

Fecha

Historial

Motivo

Julio de 2008

Se ha agregado un tema para .NET Framework 3.5 Service Pack 1.

Cambio de características de SP1.