2015-04-24 4 views
2

У меня есть некоторые проблемы с ListView, где ItemsSource может быть очень важным (более 5 000 единиц).Windows Store App ListView мерцание/содержание dispappearing

Мое приложение - приложение чата, состоящее из двух списков ListView.

  1. Один на левой стороне, поток ListView показывает список активных потоков (разговора)
  2. Один справа, разговор ListView показывает все сообщения, которыми обмениваются.

Я использую DataTemplate шаблон так, что каждый элемент моего разговора ListView настраивается следующим образом: чат Bubble используя Coding4Fun пакет: http://www.geekchamp.com/articles/getting-started-with-the-coding4fun-toolkit-windows-phone-chatbubble-control

Каждый чат Bubble имеет два TextBlock (один за содержание сообщений , другая для отметки времени).

Позже, я намерен добавить фотографии к этому сообщению.

Когда пользователь нажимает на беседу из списка ListView слева, основной диалог ListView загружается соответствующей коллекцией бесед (наблюдаемой). Если эта коллекция особенно большая (в одном случае у меня более 10 000 сообщений), то в списке ListView отображается содержимое, но как только переключается на другой поток и возвращается к предыдущему, контент не отображается больше, хотя он здесь, он загружен. Начиная прокручивание, делает мигание ListView, и содержимое, следовательно, видимо, но сильно мерцает. Если я остановлю прокрутку, контент не будет показан, показывая пустой список.

Дальнейшие испытания показали, что эта проблема возникает только с большой коллекцией в соответствии с использованием метода ScrollIntoView(): действительно, я хочу показать нижнюю часть моего разговора ListView каждый раз, когда пользователь нажимает на поток, чтобы он мог прочитать последний вместо старых, поэтому он должен каждый раз прокручивать весь путь до дна.

Я подтвердил эту проблему, прокомментировав строку, в которой я делаю ListView для прокрутки вниз. Проблема мерцания исчезла.

Наконец, как я писал мой вопрос, я нашел StackOverflow вопрос, который, кажется, мой случай: Windows Store universal app - ListView oddity

К сожалению, решение не очень понятно. Как я могу решить свою проблему? Как использовать VirtualizingStackPanel/> внутри ListView, который использует alread <ListView.ItemContainerStyle>, ListView.ItemTemplate> и <DataTemplate>?

ответ

0

Ответ на вашу проблему будет заключаться в том, чтобы перепроектировать ваше приложение.

Никогда не должно быть так много элементов в списке.Вам нужно отфильтровать некоторые результаты

Пример: отсортирует имена вопрос/типы/и т.д., и только показывают соответствующие (например, тегов в Stack Overflow)

только показывают последние строки разговора, когда вы загрузите его и позволяет пользователю загружать больше (как мессенджера facebook в)

Взгляните на этот C# listview maximum number of rows

Как говорит ответ. Количество элементов в вашем списке должно быть ограничено здравым смыслом. 5k элементов в одном списке - невероятно высокая сумма для прокрутки пользователя.

Я предполагаю, что ваши пузыри находятся в каком-то списке или массиве. Вы можете использовать Linq, чтобы получить то, что хотите. Посмотрите на эту LINQ query to select top five

+0

Я согласен с вашим подходом. Но приложение Windows Store показывает больше ограничений в отношении WPF, из-за виртуализации: https://www.microsoftpressstore.com/articles/article.aspx?p=2216995&seqNum=4. Я, наконец, сумел реализовать его, но анимация отвратительна: предыдущие чаты в чате остаются на несколько мгновений, появляется новый пузырь (из недавно выбранного потока), затем старый чат исчезает, как отставание ... Теперь я смотрю ScrollIntoView анимация ... и показывая небольшое количество пузырей на развод. Любая ссылка или руководство? – Mackovich

+0

Я предполагаю, что ваши пузыри в каком-то списке или массиве. Вы можете использовать 'Linq', чтобы получить то, что вы хотите. Взгляните на это http://stackoverflow.com/questions/4872946/linq-query-to-select-top-5 – micbobo

+0

Это позволяет вам в значительной степени просматривать список или массивы так же, как и в таблице SQL – micbobo

2

решение моей проблемы мерцающим и как реализовать UI Virtualization (нормально, введенные в ОС Windows 8.1), как описано здесь https://www.microsoftpressstore.com/articles/article.aspx?p=2216995&seqNum=4 выглядит следующим образом:

Чтобы разместить в ListView объем !

Orientation должен быть определен (Vertical | Horizontal), в противном случае возникает Critial Failure!

Виртуализация пользовательского интерфейса улучшает большие GridViews и ListViews, так что данные огромного объема могут быть эффективно загружены без замедления работы пользовательского интерфейса, блокирующего его слишком долго.

Смежные вопросы