Optimizar el rendimiento: Controles
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 Windows. Este tema contiene técnicas para mejorar el rendimiento de la interfaz de usuario.
Mostrar conjuntos de datos grandes
Los controles WPF como el ListView y el ComboBox se utilizan para mostrar listas de elementos en una aplicación. Si la lista para mostrar es grande, el rendimiento de la aplicación puede verse afectado. 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. 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, 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.
La virtualización de la interfaz de usuario es un aspecto importante de los controles de lista. No se debe confundir la virtualización de la interfaz de usuario con la virtualización de datos. 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. En cambio, la virtualización de datos solo almacena en la memoria los elementos de datos que están visibles en pantalla.
Por defecto, la virtualización de la interfaz de usuario está activada para los controles ListView y ListBox cuando sus elementos de lista están enlazados a datos. La virtualización de TreeView puede activarse estableciendo la propiedad VirtualizingStackPanel.IsVirtualizing adjunta a true
. Si desea activar la virtualización de la interfaz de usuario para los controles personalizados que derivan de ItemsControl o los controles de elementos existentes que utilizan la clase StackPanel, como ComboBox, puede establecer el ItemsPanel en VirtualizingStackPanel y establecer el IsVirtualizing en true
. Desgraciadamente, puede deshabilitar la virtualización de la interfaz de usuario para estos controles sin darse cuenta. En la siguiente lista, se muestran las condiciones que deshabilitan la virtualización de la interfaz de usuario.
Los contenedores de elementos se añaden directamente al ItemsControl. Por ejemplo, si una aplicación añade explícitamente objetos ListBoxItem a un ListBox, el ListBox no virtualiza los objetos ListBoxItem.
Los contenedores de elementos en el ItemsControl son de diferentes tipos. Por ejemplo, un Menu que usa objetos Separator no puede implementar el reciclaje de elementos porque el Menu contiene objetos de tipo Separator y MenuItem.
Establecer CanContentScroll en
false
.Establecer IsVirtualizing en
false
.
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. Si es el caso, debe guardar el estado adicional. Por ejemplo, puede tener un elemento contenido en un control Expander y el estado IsExpanded está enlazado al contenedor del elemento, y no al propio elemento. Cuando se vuelva a usar el contenedor para un elemento nuevo, el valor actual de IsExpanded se usará para el elemento nuevo. Además, el elemento antiguo pierde el valor IsExpanded correcto.
Actualmente, ningún control WPF ofrece compatibilidad integrada para la virtualización de datos.
Reciclaje de contenedores
Una optimización de la virtualización de la interfaz de usuario agregada en .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 control ItemsControl que usa la virtualización de interfaz de usuario, 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. El reciclaje de contenedores permite que el control vuelva a usar los contenedores de elementos existentes para elementos de datos diferentes, de modo que los contenedores de elementos no se crean ni se destruyen constantemente cuando el usuario desplaza el control ItemsControl. Puede optar por activar el reciclaje de elementos estableciendo la propiedad adjunta VirtualizationMode en Recycling.
Cualquier ItemsControl que sea compatible con la virtualización puede utilizar el reciclaje de contenedores. Para obtener un ejemplo de cómo habilitar el reciclaje de contenedores en ListBox, consulte Mejorar el rendimiento del desplazamiento de un control ListBox.
Compatibilidad con la virtualización bidireccional
VirtualizingStackPanel ofrece compatibilidad integrada para la virtualización de la interfaz de usuario en una dirección, ya sea horizontal o vertical. Si quiere usar 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 controlarlo en consecuencia.
Optimizar plantillas
El árbol visual contiene todos los elementos visuales de una aplicación. Además de los objetos que se crean directamente, también contiene objetos debidos a la expansión de plantilla. Por ejemplo, cuando se crea un Button, también se obtienen objetos ClassicBorderDecorator y ContentPresenter en el árbol visual. Si no ha optimizado las plantillas de control, puede crear una gran cantidad de objetos innecesarios adicionales en el árbol visual. Para obtener más información sobre el árbol visual, consulte Información general sobre la representación de gráficos en WPF.
Desplazamiento diferido
De forma predeterminada, cuando el usuario arrastra el control de posición 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 se actualiza solo cuando el usuario suelta el control de posición.
Para implementar el desplazamiento diferido, establezca la propiedad IsDeferredScrollingEnabled en true
. IsDeferredScrollingEnabled es una propiedad adjunta y se puede establecer en ScrollViewer y en cualquier control que tenga un ScrollViewer 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.
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 disponible | No disponible | Se puede habilitar. |
ListBox | Valor predeterminado | Se puede habilitar. | Se puede habilitar. |
ListView | Valor 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 TreeView, consulte Mejorar el rendimiento de un control TreeView.
Vea también
.NET Desktop feedback