2011-03-31 6 views
5

Tengo la situación de que mi aplicación C# WPF contiene un ListView cuyos elementos son expansores. Cada uno de esos expansores contiene un ListView con ListViewItems. Aquí está una imagen: enter image description hereDesplazamiento de ListView que contiene expansores que contienen ListViews no funciona

A la derecha puede ver una barra de desplazamiento. Y ese ScrollBar es mi problema. Tiene dos cuestiones:

  1. El ScrollBar no funciona cuando se utiliza la rueda del ratón sobre la lista ampliada. Con eso me refiero al área desde "Controlador" hasta "Instalación completa". Si se desplaza sobre el encabezado ("Todas las pruebas"), ScrollBar se desplaza. Creo que el ListView dentro del Expander de forma predeterminada tiene una ScrollBar que "roba" el evento MouseWheel. Sin embargo, no sé qué hacer para evitarlo.

  2. ScrollBar se desplaza sobre los elementos del expansor y no sobre el contenido de los expansores. Con eso quiero decir, que no es posible desplazarse un poco hacia abajo, sino que siempre desplaza al menos 1 elemento expansor hacia abajo. Me gustaría que la barra de desplazamiento se desplace de tal manera que sea posible ver, por ejemplo, la mitad del expansor "Todas las pruebas".

La imagen muestra una barra de desplazamiento deshabilitada, pero al hacer que la ventana sea más pequeña, la barra de desplazamiento se habilita.

lo que he probado hasta ahora:

  1. ScrollViewer fuera del ListView exterior: Esto resuelve el problema 1, sin embargo, significa que la rueda del ratón no funciona en absoluto! Esto se debe a que el ListView externo genera su propio ScrollViewer (se usó Snoop para descubrirlo) que "roba" los eventos de MouseWheel.

  2. redirigidas todos los eventos MouseWheel de todos los controles (ListView, Expander, ListViewItem) a la ScrollViewer: Una vez más he usado un ScrollViewer fuera del ListView exterior y esta vez utilizaron el evento MouseWheel para todos mis controles a llama al evento MouseWheel del ScrollViewer externo. Esto funcionó, sin embargo, para algunas ubicaciones del puntero del mouse, no funcionó. Por ejemplo, entre dos ListViewItems hay un pequeño espacio de 1 milímetro donde el evento MouseWheel no está atrapado. O en la parte inferior después del último expansor ("Pruebas cortas"). Ahí no tengo ningún evento.

Probé un par de cosas más pero no conseguí más. ¿Alguien tiene una idea de cómo resolver esto?

mejores deseos, cristianos

Respuesta

4

1) Para saber cómo escribir un comportamiento adjunto para controlar el comportamiento de la rueda del ratón cuando haya anidado itemscontrols, ver: WPF Nested ScrollViewer/ListBox Scrolling

2) ItemsControl no virtualizado es compatible con el desplazamiento suave, véase: Is it possible to implement smooth scroll in a WPF listview?

+0

¡El número 1 fue la solución! ¡Muchas gracias! ¡Salvó mi día! – Christian

+1

su primer enlace (fuera de SO) está muerto. –

Cuestiones relacionadas