2011-05-12 21 views
5

Me gustaría saber cuántas filas realmente se muestran en un WPF DataGrid.Cuenta el número de filas visibles en un DataGrid

me trataron bucle sobre DataGridRow y comprobando IsVisible, pero parece que las líneas de informe IsVisible = true incluso cuando no están en la ventana gráfica DataGrid.

¿Cómo puedo contar correctamente el número de filas visibles?

Respuesta

1

que he hecho esta pregunta también en el foro de MSDN y consiguió un good answer:

private bool IsUserVisible(FrameworkElement element, FrameworkElement container) { 
    if (!element.IsVisible) 
     return false; 
    Rect bounds = element.TransformToAncestor(container).TransformBounds(new Rect(0.0, 0.0, element.ActualWidth, element.ActualHeight)); 
    Rect rect = new Rect(0.0, 0.0, container.ActualWidth, container.ActualHeight); 
    return rect.Contains(bounds.TopLeft) || rect.Contains(bounds.BottomRight); 
} 
0

un simple truco vienen a la mente,

bucle sobre todas las filas y comprobar si el artículo tiene un contenedor?

dataGrid.GetContainerFromItem(dataGrid.Items[row]); 

esperanza esto ayuda

+1

Esto no funciona. De hecho, en mi ciclo estaba usando 'ItemContainerGenerator.ContainerFromIndex' y algunos elementos que aún no se muestran tienen contenedor. –

1

que tenía el mismo problema con filas mostrando como Visible = true incluso cuando no estaban 't.

Tratando de encontrar una solución, publiqué esta pregunta: Visible rows in DataGrid is off by 1 (counted using ContainerFromItem).

Esto es lo que funcionó para mí:

uint VisibleRows = 0; 
var TicketGrid = (DataGrid) MyWindow.FindName("TicketGrid"); 

foreach(var Item in TicketGrid.Items) { 
    var Row = (DataGridRow) TicketGrid.ItemContainerGenerator.ContainerFromItem(Item); 

    if(Row != null) { 
     if(Row.TransformToVisual(TicketGrid).Transform(new Point(0, 0)).Y + Row.ActualHeight >= TicketGrid.ActualHeight) { 
      break; 
     } 

     VisibleRows++; 
    } 
} 

Para mayor orientación, hay algunos /* comments */ en mi respuesta a la pregunta vinculada, así como un hilo de comentarios del usuario en la pregunta misma que llevó a la respuesta .

Cuestiones relacionadas