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.
Se agregan contenedores de elementos directamente a ItemsControl. Por ejemplo, si una aplicación agrega explícitamente objetos ListBoxItem a ListBox, ListBox no virtualiza los objetos ListBoxItem. Para obtener más información sobre los contenedores de elementos, consulte la sección "ItemsControl" en Información general sobre el modelo de contenido de controles.
Se establece CanContentScroll en false.
Se establece IsVirtualizing en false.
Se utiliza la agrupación de elementos.
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:
Se agregan contenedores de elementos directamente a ItemsControl. Por ejemplo, se agregan objetos ListBoxItem directamente a un control ListBox. Para obtener más información sobre los contenedores de elementos, consulte la sección "ItemsControl" en Información general sobre el modelo de contenido de controles.
Los contenedores de elementos de ItemsControl son de tipos diferentes. Por ejemplo, un control Menu que utiliza los objetos Separator no puede implementar el reciclaje de elementos porque Menu contiene objetos de tipo Separator y de tipo MenuItem.
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 |
---|---|---|---|
Se puede habilitar |
Se puede habilitar |
Se puede habilitar |
|
Se puede habilitar |
Se puede habilitar |
Se puede habilitar |
|
No está disponible |
No está disponible |
Se puede habilitar |
|
Opción predeterminada |
Se puede habilitar |
Se puede habilitar |
|
Opción predeterminada |
Se puede habilitar |
Se puede habilitar |
|
Se puede habilitar |
Se puede habilitar |
Se puede habilitar |
|
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
Optimizar el rendimiento: Presentación y diseño
Optimizar el rendimiento: Enlace de datos
Información general sobre controles
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. |