ListView UWP中的第一个可见组

时间:2016-07-19 08:20:48

标签: listview uwp

我有这个示例应用程序,每当我滚动它时,我试图在列表视图中获取第一个可见组。当我向上滚动以查看列表视图中的初始项时,会发生此问题。它会更新顶部可见组,但只有在列表完成滚动时才会更新它。因此,如果我进行轻弹滚动(点击,滚动并从屏幕上移开手指并让其按惯性滚动),有时候,在更新顶部可见组值时会滞后。这是我的示例应用的链接:https://1drv.ms/u/s!AhChIerZubKRh3C4DhCZ3K7jpm6u

编辑:我上传了视频以显示问题所在。在这里,您可以看到顶部文本块只有在滚动完全停止后才会更新:https://1drv.ms/v/s!AhChIerZubKRh3pmL6IsQNi0Mrm1

1 个答案:

答案 0 :(得分:1)

问题出在滚动过程中,TextBlock名为" tbHeader"的位置是ListView中的真实位置,它更像是在那里用于显示标题是假的(我会在显示位置显示标题TextBlock),当滚动停止时,它就像标题TextBlock一样插入标题&#39 ; s从其阅读位置显示位置。

所以这是我的解决方案,我们找不到所有TextBlock名为" tbHeader"此外,我们可以在此ListViewItemPresenter中找到所有ListView并找到第一个显示项目,最后显示其" DateTimePropertyOfClassA"(标题)属性。

sv.ViewChanged += (ss, ee) =>
{
    //IEnumerable<TextBlock> tblocks = FindVisualChildren<TextBlock>(lv).Where(x => x.Name == "tbHeader");
    //if (tblocks != null)
    //{
    //    foreach (TextBlock tblock in tblocks)
    //    {
    //        if (IsVisibileToUser(tblock, sv))
    //        {
    //            first.Text = tblock.Text;
    //            break;
    //        }
    //    }
    //}
    IEnumerable<ListViewItemPresenter> presenters = FindVisualChildren<ListViewItemPresenter>(lv);
    if (presenters != null)
    {
        foreach (ListViewItemPresenter presenter in presenters)
        {
            if (IsVisibileToUser(presenter, sv))
            {
                var content = presenter.Content as ClassA;
                first.Text = content.DateTimePropertyOfClassA.ToString();
                break;
            }
        }
    }
};

其他代码仍然是我们讨论的最后一个案例。