內獲取視圖中的項目我有一個屬性VirtualizingStackPanel.VirtualizationMode設置爲「回收」的列表框。 我綁定了一個自定義集合(實現了IList
和IList<T>
)。一個列表框
現在,如果我理解正確的,當數據被綁定,GetEnumerator的叫。
然後物業public T this[int index] { }
被稱爲在當前視圖中的每個項目。
我的問題是如何獲得當前可見(數據加載後)的項目?
內獲取視圖中的項目我有一個屬性VirtualizingStackPanel.VirtualizationMode設置爲「回收」的列表框。 我綁定了一個自定義集合(實現了IList
和IList<T>
)。一個列表框
現在,如果我理解正確的,當數據被綁定,GetEnumerator的叫。
然後物業public T this[int index] { }
被稱爲在當前視圖中的每個項目。
我的問題是如何獲得當前可見(數據加載後)的項目?
有時回我也面臨着同樣的問題。通過使用ListBox的「SelectedItem」,我發現了一個解決方法,因爲所選項目總是可見的。在我的情況下,這是滾動這是造成問題。你可以看看是否有幫助 -
Virtualization issue in listbox
我不明白爲什麼項目選擇自動意味着該項目是可見的,它可以很好地選擇,但不是在視野中。 – 2012-09-28 14:43:16
:)開發人員現在習慣了。 – Rohit 2012-09-28 16:20:21
試圖找出類似的東西后,我想我會在這裏分享我的結果(因爲它比其他的反應似乎更容易):
簡單的可視化檢測,我從here了。
private static 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));
var rect = new Rect(0.0, 0.0, container.ActualWidth, container.ActualHeight);
return rect.Contains(bounds.TopLeft) || rect.Contains(bounds.BottomRight);
}
之後,您可以遍歷ListBoxItems並使用該測試來確定哪些是可見的。
private List<object> GetVisibleItemsFromListbox(ListBox listBox, FrameworkElement parentToTestVisibility)
{
var items = new List<object>();
foreach (var item in PhotosListBox.Items)
{
if (IsUserVisible((ListBoxItem)listBox.ItemContainerGenerator.ContainerFromItem(item), parentToTestVisibility))
{
items.Add(item);
}
else if (items.Any())
{
break;
}
}
return items;
}
您在這裏有一個答案: http://stackoverflow.com/questions/11187382/get-listview-visible-items – GameAlchemist 2012-06-25 16:18:20