Windows应用商店应用ListView闪烁/内容消失

时间:2015-04-24 11:00:57

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

ListView我遇到一些问题ItemsSource可能非常重要(超过5'000件)。

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

  1. 一个在左边,线程ListView显示活动线程列表 (会话)
  2. 在右侧,会话ListView显示所有已交换的消息。
  3. 我正在使用DataTemplate模式,以便我的对话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的底部以便他能够阅读最后的消息而不是oldes,因此每次都要将他保存到底部。

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

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

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

2 个答案:

答案 0 :(得分:2)

我的闪烁问题的解决方案以及如何实现这里描述的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阻止它持续太长时间。

答案 1 :(得分:0)

您的问题的答案很可能是重新设计您的应用程序。

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

示例:对问题名称/类型/等进行排序并仅显示相应的(例如Stack Overflow中的标记)

仅在加载对话时显示对话的最后几行,并允许用户加载更多内容(例如facebook&#39; s messenger)

看看这个C# listview maximum number of rows

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

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