Compartir a través de


Optimización del rendimiento: controles

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

Visualización de grandes conjuntos de datos

Los controles WPF como y ListViewComboBox se usan para mostrar listas de elementos en una aplicación. Si la lista que se va a mostrar es grande, el rendimiento de la aplicación puede verse afectado. Esto se debe a que 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 todos los elementos al mismo tiempo; en su lugar, muestra un subconjunto y el usuario se desplaza por la lista. En este caso, tiene sentido usar la virtualización de la interfaz de usuario, lo 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 esté visible.

La virtualización de la interfaz de usuario es un aspecto importante de los controles de lista. La virtualización de la interfaz de usuario no debe confundirse con la virtualización de datos. La virtualización de la interfaz de usuario solo almacena elementos visibles en la memoria, pero en un escenario de enlace de datos almacena toda la estructura de datos en la memoria. En cambio, la virtualización de datos almacena solo los elementos de datos que están visibles en la pantalla en la memoria.

De forma predeterminada, la virtualización de la interfaz de usuario está habilitada para los ListView controles y ListBox cuando sus elementos de lista están enlazados a los datos. TreeView La virtualización se puede habilitar definiendo la propiedad adjunta VirtualizingStackPanel.IsVirtualizing a true. Si desea habilitar la virtualización de la interfaz de usuario para controles personalizados que derivan de ItemsControl o controles de elementos existentes que usan la clase StackPanel, como ComboBox, puede establecer ItemsPanel en VirtualizingStackPanel y establecer IsVirtualizing en true. Desafortunadamente, puede deshabilitar la virtualización de la interfaz de usuario para estos controles sin darse cuenta de ello. A continuación se muestra una lista de condiciones que deshabilitan la virtualización de la interfaz de usuario.

Una consideración importante al virtualizar contenedores de elementos es si tiene información de estado adicional asociada a un contenedor de elementos que pertenece al elemento. En este caso, debe guardar el estado adicional. Por ejemplo, puede tener un elemento contenido en un Expander control y el IsExpanded estado está enlazado al contenedor del elemento y no al propio elemento. Cuando el contenedor se reutiliza para un nuevo elemento, el valor actual de IsExpanded se usa para el nuevo elemento. Además, el elemento anterior pierde el valor correcto IsExpanded .

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

Reciclaje de contenedores

Una optimización para la virtualización de la interfaz de usuario, agregada en .NET Framework 3.5 SP1 para controles que heredan de ItemsControl, es el reciclaje de contenedores, lo que también puede mejorar el rendimiento del desplazamiento. Cuando se rellena una ItemsControl clase que usa la virtualización de la interfaz de usuario, crea un contenedor de elementos para cada elemento que se desplaza hacia la vista y destruye el contenedor de elementos para cada elemento que se desplaza fuera de la vista. El reciclaje de contenedores permite al control del sistema reutilizar los contenedores de ítems existentes para diferentes ítems de datos, de modo que los contenedores de ítems no se creen y destruyan constantemente a medida que el usuario desplaza el ItemsControl. Puede optar por habilitar el reciclaje de elementos estableciendo la VirtualizationMode propiedad adjunta en Recycling.

Cualquiera ItemsControl que admita la virtualización puede usar el reciclaje de contenedores. Para obtener un ejemplo de cómo habilitar el reciclaje de contenedores en un ListBox, vea Mejorar el rendimiento de desplazamiento de un ListBox.

Compatibilidad con la virtualización bidireccional

VirtualizingStackPanel ofrece compatibilidad integrada con la virtualización de la interfaz de usuario en una dirección, ya sea horizontal o verticalmente. Si desea usar la virtualización bidireccional para los controles, debe implementar un panel personalizado que extienda la VirtualizingStackPanel clase. La VirtualizingStackPanel clase expone métodos virtuales como OnViewportSizeChanged, LineUp, PageUpy MouseWheelUp. Estos métodos virtuales permiten detectar un cambio en la parte visible de una lista y controlarlo en consecuencia.

Optimización de plantillas

El árbol visual contiene todos los elementos visuales de una aplicación. Además de los objetos creados directamente, también contiene objetos debido a la expansión de plantillas. Por ejemplo, al crear un Button, también obtiene los objetos ClassicBorderDecorator y ContentPresenter en el árbol visual. Si no ha optimizado las plantillas de control, puede crear muchos objetos innecesarios adicionales en el árbol visual. Para obtener más información sobre el árbol visual, vea Información general sobre la representación de gráficos de WPF.

Desplazamiento diferido

De forma predeterminada, cuando el usuario arrastra el pulgar en una barra de desplazamiento, la vista de contenido se actualiza continuamente. Si el desplazamiento es lento en el control, considere la posibilidad de usar el desplazamiento diferido. En el desplazamiento diferido, el contenido solo se actualiza cuando el usuario libera el pulgar.

Para implementar el desplazamiento diferido, establezca la propiedad IsDeferredScrollingEnabled en true. IsDeferredScrollingEnabled es una propiedad adjunta y se puede establecer en ScrollViewer y cualquier control que tenga un ScrollViewer elemento en su plantilla de control.

Controles que implementan características de rendimiento

En la tabla siguiente se enumeran los controles comunes para mostrar datos y su compatibilidad con las características de rendimiento. Consulte las secciones anteriores para obtener información sobre cómo habilitar estas características.

Supervisión 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 disponible No disponible Se puede habilitar
ListBox Predeterminado Se puede habilitar Se puede habilitar
ListView Predeterminado Se puede habilitar Se puede habilitar
TreeView Se puede habilitar Se puede habilitar Se puede habilitar
ToolBar No disponible No disponible Se puede habilitar

Nota:

Para obtener un ejemplo de cómo habilitar la virtualización y el reciclaje de contenedores en un TreeView, vea Mejorar el rendimiento de un TreeView.

Consulte también