¿Forzar la visualización de barras de desplazamiento en ListView?

El fondo: La mayoría de nosotros conocemosSysListView32 control común y el contenedor equivalenteListView clase proporcionada por el.NET Framework. Un poco de profundidad en sus partes internas muestra que las barras de desplazamiento que proporciona para desplazar su contenido sonNO se controlan, pero son gestionados por elSysListView32 controlar.

La meta: Siempre dibuje barras de desplazamiento incluso si no tieneListViewItems para mostrar o tiene muy pocos, de modo que no se necesitan barras de desplazamiento de todos modos; algo así como imitar elRichTextBox clase con suScrollBars propiedad establecida enForcedBoth. O algo asíListBox:

Los problemas):

.RED tieneNO azúcar en absoluto para barras de desplazamiento dentro de unListView.La documentación de Win32 no indica cuándomostrar ocultar y / ohabilitar deshabilitar barras de desplazamiento.

Mi solución (s):

override elWndProc en una clase derivada y manejar suWM_HSCROLL yWM_VSCROLL mensajes según los pasos 2 y 3.Llamadabase.WndProc para hacer el procesamiento realmente requerido de la funcionalidad de desplazamiento.Crea un método comoWmScroll y hacermi procesando inmediatamenteafter base.WndProc ha regresado.Esto consiste en una llamada p / invoke aGetScrollInfo. Determine si realmente se necesita una barra de desplazamiento. Si no es así, llameShowScrollBar yEnableScrollBar con los valores requeridos para dibujar barras de desplazamiento visiblemente deshabilitadas.

Problemas con la solución:

Apenas funciona. Las barras de desplazamiento se muestran y deshabilitan, pero son como las que se encuentran debajo deTema clásico de Windows.Oculta los botones de colapso de cadaListViewGroup¡Haciéndolos inútiles!

La imagen descriptiva:

La pregunta real tan esperada:

¿Cómo fuerzo las barras de desplazamiento para que siempre estén Visible Dentro de un ListView independientemente del número de ListViewItems y deshabilítelos si son innecesarios, al mismo tiempo evitando el cálculo erróneo del tamaño (para mostrar los botones de colapso de ListViewGroups) y el deterioro del tema?

Respuestas sin código y respuestas con código enC#, VB.NET yC ++ / CLR son bienvenidos. Si publica el código en cualquier otro idioma compatible con .NET, también deje un enlace a un sitio web de conversión de código que pueda usar si el código parece, eh, incomprensible.

Respuestas a la pregunta(1)

Su respuesta a la pregunta