2009-03-18 13 views
7

Tengo un WPF DataGrid, que cuando hay demasiadas filas para ver en la pantalla obtiene una barra de desplazamiento vertical. Lo que me gustaría saber es si hay una forma de saber cuál es la fila visible superior cuando el usuario está desplazándose.Verificar filas visibles en un WGD DataGrid

Idealmente, me gustaría poder conectar un evento para saber cuándo el usuario está desplazándose y desplazarse, verificar cuál es la fila visible superior para actualizar cierta información.

Respuesta

0

Es una forma un poco complicada de hacerlo, pero puede funcionar. Primero, subclase DataGridRowsPresenter y anule el OnViewportOffsetChanged method. A continuación, duplique la plantilla de control estándar para la cuadrícula de datos y reemplace DataGridRowsPresenter por la suya. Dejo para ti los detalles de la prueba de golpe para una fila relativa a la ventana ;-).

¿Qué intentas lograr, específicamente? Tal vez podamos encontrar una forma mejor, ya que puede ser muy frágil y requiere un montón de trabajo adicional (es decir, mantener la plantilla de control sincronizada si la actualizan).

+0

Gracias. Lo he solucionado simplemente escalando lo que hay en la grilla (principalmente fuentes) usando animaciones. No del todo simple, pero básicamente lo que quería. –

+0

Me encontré con un problema al escalar la fuente, que al escalar la fuente hacia abajo las columnas no cambiarán el tamaño automáticamente, por lo que siguen siendo el ancho del tamaño de fuente más grande. –

+0

Desafortunadamente, hay un error en la compilación actual de WPFToolkit que hace que las columnas de cambio de tamaño automático funcionen de manera extraña cuando se mezclan con columnas de tamaño Estrella. Vemos ese comportamiento también, y nunca nos hemos molestado en solucionarlo. –

3

utilizando el siguiente método funcionó para mí:

// mHorizontalScrollBar is the HorizontalScrollBar subclass control's instance 

// Get the total item count 
nTotalCount = DataGrid1.Items.Count; 

// Get the first visible row index 
nFirstVisibleRow = mHorizontalScrollBar.Value; 

// Get the last visible row index 
nLastVisibleRow = nFirstVisibleRow + nTotalCount - mHorizontalScrollBar.Maximum; 
+0

@DannyBeckett, la edición hace que la respuesta sea completamente inútil (o, bueno, muy poco clara), volviendo a la respuesta original. – Sinatr

+1

@Sinatr No estoy de acuerdo y he retrocedido su cambio. Si aún no está de acuerdo, publique una pregunta Meta Stack Exchange en lugar de iniciar una guerra de reversión. –

+0

@DannyBeckett, antes era una guía paso a paso (estoy de acuerdo con un lenguaje algo malo) y estoy seguro de que se dieron votaciones en ese momento. Ahora corro en el mismo problema y cuando intento esta respuesta en el estado actual no lo hago funcionar e incluso lo rechazo. Luego veo tu edición y leo la respuesta original, que es más clara. Dejémoslo como está. Los futuros lectores verán mi comentario de todos modos (pero no todos podrán ver las revisiones, supongo, no es mi problema;). – Sinatr

2

Cómo acerca de la suscripción al evento ScrollViewer.ScrollChanged en ScrollViewer de la cuadrícula de datos? Los argumentos del evento son bastante extensos y describen cuánto se movió ScrollViewer y cuál es su nueva compensación vertical. También, de acuerdo a MSDN:

Si CanContentScroll es cierto, los valores de las propiedades ExtentHeight, ScrollableHeight, ViewportHeight, y VerticalOffset son número de elementos. Si CanContentScroll es falso, los valores de estas propiedades son Píxeles independientes del dispositivo.

CanContentScroll es de hecho el caso del ScrollViewer para un DataGrid.

Todo lo que tiene que hacer es encontrar el ScrollViewer:

ScrollViewer scrollview = FindVisualChild<ScrollViewer>(dataGrid); 

usando una implementación de FindVisualChild que se pueden encontrar en varios lugares (como aquí: Finding control within WPF itemscontrol).

+0

Este es un enfoque agradable y sólido. – Gerard

0

La detección de desplazamiento es tan fácil como

<DataGrid ScrollViewer.ScrollChanged="DataGrid_ScrollChanged" /> 

Ahora usted debe obtener ejemplo ScrollViewer:

void DataGrid_ScrollChanged(object sender, RoutedEventArgs e) 
{ 
    var scroll = FindVisualChild<ScrollViewer>((DependencyObject)sender); 
    ... 
} 

(No estoy seguro de dónde está el origen de FindVisualChild, pero hay un montón de implementaciones, por ejemplo here)

Y luego puede

int firstRow = (int)scroll.VerticalOffset; 
int lastRow = (int)scroll.VerticalOffset + (int)scroll.ViewportHeight + 1; 
Cuestiones relacionadas