【问题标题】:Windows Store App ListView flickering / content dispappearingWindows Store App ListView 闪烁/内容消失
【发布时间】:2015-04-24 11:00:57
【问题描述】:

ListView 有一些问题,ItemsSource 可能非常重要(超过 5'000 个项目)。

我的应用程序是由两个 ListView 组成的聊天应用程序。

  1. 左边一个,线程ListView显示活动线程列表 (对话)
  2. 在右侧,对话 ListView 显示所有交换的消息。

我正在使用DataTemplatepattern,以便我的对话 ListView 的每个项目都自定义如下: 使用Coding4Fun 包的聊天气泡:http://www.geekchamp.com/articles/getting-started-with-the-coding4fun-toolkit-windows-phone-chatbubble-control

每个聊天气泡有两个TextBlock(一个用于消息内容,另一个用于时间戳)。

稍后,我打算在此消息中添加图片。

当用户从左面板 ListView 中单击对话时,主对话 ListView 会加载相应的对话(可观察)集合。 如果该集合特别大(在一种情况下,我有超过 10,000 条消息),对话 ListView 会显示内容,但一旦切换到另一个线程并返回上一个,内容就不再显示,虽然它在这里,但它已加载。开始滚动,使 ListView 闪烁,因此内容可见但严重闪烁。如果我停止滚动,则不显示任何内容,显示一个空列表。

进一步的测试表明,这个问题只发生在与 ScrollIntoView() 方法的使用一致的大型集合中:确实,我希望每次用户单击线程时都显示我的对话底部 ListView 以便他可以阅读最后一条消息而不是旧消息,因此他每次都必须一直滚动到底部。

我通过注释掉让 ListView 滚动到底部的行来确认这个问题。闪烁问题消失了。

最后,当我写下我的问题时,我发现了一个似乎是我的情况的 stackoverflow 问题:Windows Store universal app - ListView oddity

不幸的是,解决方案不是很清楚。我该如何解决我的问题?我应该如何在使用<ListView.ItemContainerStyle>ListView.ItemTemplate><DataTemplate>的ListView中使用VirtualizingStackPanel/>

【问题讨论】:

    标签: c# xaml listview windows-store-apps


    【解决方案1】:

    https://www.microsoftpressstore.com/articles/article.aspx?p=2216995&seqNum=4 所述,我的闪烁问题以及如何实现 UI 虚拟化(通常在 Windows 8.1 中引入)的解决方案如下:

    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel Orientation="Vertical"/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
    

    要放置在ListView 范围内!

    必须定义Orientation (Vertical | Horizontal) 否则会出现Critial Failure

    UI 虚拟化增强了大型 GridViews 和 ListViews,因此可以有效地加载大量数据,而不会减慢 UI,也不会阻塞太久。

    【讨论】:

      【解决方案2】:

      老实说,您的问题的答案是重新设计您的应用程序。

      列表视图中永远不应该有这么多项目。你需要过滤掉一些结果

      示例:对问题名称/types/等进行排序,只显示对应的(如Stack Overflow中的标签)

      仅在加载时显示对话的最后几行并允许用户加载更多内容(如 facebook 的 Messenger)

      看看这个C# listview maximum number of rows

      正如答案所说。您的列表视图中的项目数量应受到常识的限制。一个列表视图中的 5k 个项目对于用户滚动浏览来说是非常高的数量。

      我假设您的气泡位于某种列表或数组中。你可以使用 Linq 来获得你想要的东西。看看这个LINQ query to select top five

      【讨论】:

      • 我同意你的做法。但是由于虚拟化,Windows Store App 对 WPF 显示出更多限制:microsoftpressstore.com/articles/…。我终于设法实现了它,但是动画有点难看:以前的聊天气泡仍然存在片刻,新的气泡出现(来自新选择的线程),然后旧的聊天消失了,就像一个滞后......我现在正在看 ScrollIntoView动画...并在每次对话中显示少量气泡。任何链接或指南?
      • 我假设您的气泡位于某种列表或数组中。你可以使用Linq 来得到你想要的。看看这个stackoverflow.com/questions/4872946/linq-query-to-select-top-5
      • 这让您可以像处理 SQL 表一样浏览列表或数组
      • 是的,我的程序中有一个 ObsverableCollection 对话。我将研究 LINQ 解决方案。但问题是,我很难知道用户何时更深入地滚动对话,这意味着他想要阅读的不仅仅是最后的 x 条消息。在某个时刻,他将到达 ListView 的开头。我怎么知道,所以我可以让它加载下 x 个先前的消息?感谢您的快速回复!
      • 我不确定如何执行此操作,但请寻找“到达列表视图底部”的解决方案。如果您有时间调查stackoverflow.com/questions/17237012/…,我认为这可能会有所帮助。然后您可以调整代码以达到顶部
      猜你喜欢
      • 2013-01-10
      • 2021-11-09
      • 1970-01-01
      • 2011-03-14
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多