UWP自定义虚拟化列表视图

问题描述 投票:0回答:1

我正在尝试使用虚拟化重新创建列表视图,以更深入地了解列表视图的工作原理。为此,我正在创建一个自定义面板。当列表视图项目垂直排列时,我需要知道面板高度。假设如果项目具有相同的高度,那么我可以找到面板的高度为 ItemsSource.Count * itemHeight。如果项目的高度不同,我如何设置面板的高度而不计算所有单个项目的高度。

此外,当所有项目都具有相同高度时,我可以根据 ItemsSource 中项目的索引滚动到某个项目(即)index * itemheight 将给出该项目在面板中的位置。如果高度不同,我怎样才能找到这个位置。请指导。谢谢

c# uwp uwp-xaml
1个回答
0
投票

好的,我明白了。建议在

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);

}
© www.soinside.com 2019 - 2024. All rights reserved.