ListView
我遇到一些问题ItemsSource
可能非常重要(超过5'000件)。
我的应用程序是由两个ListView组成的聊天应用程序。
我正在使用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>
?
答案 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