¿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 ListViewGroup
s) 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.