Have a look at this question on MSDN showing a technique to find out the visible ListView
items –
How to find the rows (ListViewItem(s)) in a ListView that are actually visible?
Here’s the relevant code from that post –
listView.ItemsSource = from i in Enumerable.Range(0, 100) select "Item" + i.ToString();
listView.Loaded += (sender, e) =>
{
ScrollViewer scrollViewer = listView.GetVisualChild<ScrollViewer>(); //Extension method
if (scrollViewer != null)
{
ScrollBar scrollBar = scrollViewer.Template.FindName("PART_VerticalScrollBar", scrollViewer) as ScrollBar;
if (scrollBar != null)
{
scrollBar.ValueChanged += delegate
{
//VerticalOffset and ViweportHeight is actually what you want if UI virtualization is turned on.
Console.WriteLine("Visible Item Start Index:{0}", scrollViewer.VerticalOffset);
Console.WriteLine("Visible Item Count:{0}", scrollViewer.ViewportHeight);
};
}
}
};
Another thing you should do is to use ObservableCollection
as your ItemSource
instead of an Array
; that will definitely improve the performance.
Update:
Ya that might be true(array
vs. ObservableCollection
) but I would like to see some statistics related to this;
The real benefit of ObservableCollection
is if you have a requirement to add/remove items from your ListView
at run-time, in case of an Array
you will have to reassign the ItemSource
of ListView
and the ListView
first throws away its previous items and regenerates its entire list.