我正在尝试使用虚拟化重新创建列表视图,以更深入地了解列表视图的工作原理。为此,我正在创建一个自定义面板。当列表视图项目垂直排列时,我需要知道面板高度。假设如果项目具有相同的高度,那么我可以找到面板的高度为 ItemsSource.Count * itemHeight。如果项目的高度不同,我如何设置面板的高度而不计算所有单个项目的高度。
此外,当所有项目都具有相同高度时,我可以根据 ItemsSource 中项目的索引滚动到某个项目(即)index * itemheight 将给出该项目在面板中的位置。如果高度不同,我怎样才能找到这个位置。请指导。谢谢
好的,我明白了。建议在
VirtualizingStackPanel
中使用ItemsPanelTemplate
。使用VirtualizingStackPanel
后,从物理滚动变为逻辑滚动。这将消除高度差异的影响。
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Loaded="ItemsStackPanel_Loaded"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
private void ItemsStackPanel_Loaded(object sender, RoutedEventArgs e)
{
var scrollViewer = YourListView.GetScrollViewer();
scrollViewer.VerticalSnapPointsType = SnapPointsType.OptionalSingle;
scrollViewer.ViewChanged += ScrollViewer_ViewChanged; ;
}
private void ScrollViewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
var elemnt = (sender as ScrollViewer);
if (elemnt != null)
{
Debug.WriteLine($"Scrollable Height : {elemnt.ScrollableHeight} Scrolled Height {elemnt.VerticalOffset}");
}
}
//a sample which scroll into 8 logically
private void Button_Click(object sender, RoutedEventArgs e)
{
var scrollViewer = AuthorGroupsListView.GetScrollViewer();
scrollViewer.ChangeView(null, 8, null, true);
}