【问题标题】:First Visible Group in the ListView UWPListView UWP 中的第一个可见组
【发布时间】:2016-07-20 18:01:06
【问题描述】:

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

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

【问题讨论】:

  • 我在 win10 pc 和 windows phone 上运行了您的示例,但未能重现问题。请您再检查一下,如果这个样本是可以重现问题的正确样本吗?
  • 是的,这是我仍然面临问题的正确示例代码。我在这里上传了一个视频来展示我面临的问题:1drv.ms/v/s!AhChIerZubKRh3pmL6IsQNi0Mrm1

标签: listview uwp


【解决方案1】:

问题是在滚动过程中,名为“tbHeader”的TextBlock的位置是它在ListView中的真实位置,这更像是一个假的显示标题(我会说一个标题@987654323 @在显示位置),当滚动停止时,就像标题TextBlock从它的读取位置插入到标题的显示位置。

所以这是我的解决方案,我们找不到所有名为“tbHeader”的TextBlocks,我们可以在这个ListView中找到所有ListViewItemPresenter并找到第一个显示的项目,最后显示它的“ DateTimePropertyOfClassA"(header) 属性。

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

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

【讨论】:

    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多