我在使用 ListView
时遇到了一些问题ItemsSource
在哪里可能非常重要(超过 5,000 项)。
我的应用程序是由两个 ListView 组成的聊天应用程序。
- 左边一个,线程ListView显示事件线程列表 (对话)
- 右边一个,对话 ListView 显示所有已交换的消息。
我正在使用 DataTemplate
模式,以便我的对话 ListView 的每个项目都自定义如下:
使用 Coding4Fun
的聊天气泡包裹:http://www.geekchamp.com/articles/getting-started-with-the-coding4fun-toolkit-windows-phone-chatbubble-control
每个聊天气泡都有两个 TextBlock
(一个用于消息内容,另一个用于时间戳)。
稍后,我打算在此消息中添加图片。
当用户单击左侧面板 ListView 中的对话时,主对话 ListView 会加载相应的对话(可观察)集合。 如果该集合特别大(在一种情况下,我有超过 10'000 条消息), session ListView 会显示内容,但是一旦切换到另一个线程并返回到前一个,内容就不再显示,虽然它在这里,但它已加载。开始滚动,使 ListView 闪烁,因此内容可见但严重闪烁。如果我停止滚动,则不会显示任何内容,显示一个空列表。
进一步的测试表明,这个问题只发生在使用 ScrollIntoView()
的大集合中。方法:事实上,我希望每次用户单击一个线程时显示我的对话 ListView 的底部,以便他可以阅读最后一条消息而不是旧消息,因此节省了他必须一直滚动到底部,每个时间。
我通过注释掉让 ListView 滚动到底部的行来确认这个问题。闪烁问题消失了。
最后,当我写下我的问题时,我发现了一个似乎是我的情况的 stackoverflow 问题:Windows Store universal app - ListView oddity
不幸的是,解决方案不是很清楚。我该如何解决我的问题?我应该如何使用 VirtualizingStackPanel/>
在已经使用 <ListView.ItemContainerStyle>
的 ListView 中, ListView.ItemTemplate>
和 <DataTemplate>
?
最佳答案
我的闪烁问题的解决方案以及如何实现 UI 虚拟化(通常在 Windows 8.1 中引入),如此处所述 https://www.microsoftpressstore.com/articles/article.aspx?p=2216995&seqNum=4如下:
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
放置在 ListView
范围内!
Orientation
必须定义(Vertical | Horizontal
)否则会发生Critial Failure
!
UI 虚拟化增强了大型 GridView 和 ListView,因此可以有效地加载大量数据,而不会减慢 UI 的速度,也不会阻塞它太久。
关于c# - Windows Store App ListView 闪烁/内容消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29845771/