2011-05-12 48 views
5

我想知道WPF DataGrid實際顯示了多少行。計算DataGrid中可見行的數量

我試圖遍歷DataGridRow和檢查IsVisible,但似乎行報告IsVisible = true即使他們不在DataGrid口中。

如何正確計數可見行數?

回答

1

我問過這個問題,也MSDN論壇,並得到了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

一個簡單的黑客浮現在腦海中,

遍歷所有行,並檢查是否有物品的容器?

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

希望這有助於

+1

這不起作用。事實上,在我的循環中,我使用了'ItemContainerGenerator.ContainerFromIndex',一些沒有顯示的項目仍然有容器。 – 2011-05-12 15:44:50

1

我曾與行顯示爲Visible = true,即使他們間沒有同樣的問題「T。

試圖想出一個解決方案,我發佈了這個問題:Visible rows in DataGrid is off by 1 (counted using ContainerFromItem)

下面是我工作:

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++; 
    } 
} 

對於進一步的指導,也有一些/* comments */在我的答案上鍊接的問題,以及對問題本身,導致瞭解答用戶評論線程。