Моя цель - симулировать "бесконечную прокрутку" в WPF ListView
. Я выполнил эту задачу с помощью менее чем идеальных методов, и я уверен, что есть лучший способ сделать это.
под "бесконечной прокруткой" я имею в виду следующее:
Допустим, у ListView
есть 20 предметов (заказано 1, 2, 3, 4, ... 17, 18, 19, 20
). Когда пользователь прокручивает вниз один элемент, элемент в верхней части ListView
удаляется и помещается в конце ListView
, поэтому порядок элементов составляет 2, 3, 4, 5, ... 18, 19, 20, 1
. Теперь, если пользователь прокручивает два элемента вниз, два верхних элемента удаляются и помещаются в конец, поэтому порядок элементов равен 4, 5, 6, 7, ... 20, 1, 2, 3
. Теперь, аналогично, если пользователь прокручивает один элемент вверх, элемент в нижней части ListView
удаляется и помещается в начало, поэтому порядок элементов равен 3, 4, 5, 6, ... 19, 20, 1, 2
.
Я выполнил эту задачу с помощью следующей функции, назначенной событию ScrollChanged
для ScrollViewer
Я хочу быть "бесконечным":
// sv - the ScrollViewer to which this event handler is listening
// lv - the ListView associated with "sv"
bool handle_scroll = true;
private void inf_scroll(object sender, ScrollChangedEventArgs e) {
if (handle_scroll) {
for (int i = 0; i < e.VerticalChange; i++) {
object tmp = lv.Items[0];
lv.Items.RemoveAt(0);
lv.Items.Add(tmp);
handle_scroll = false;
}
for (int i = 0; i > e.VerticalChange; i--) {
object tmp = lv.Items[lv.Items.Count - 1];
lv.Items.RemoveAt(lv.Items.Count - 1);
lv.Items.Insert(0, tmp);
handle_scroll = false;
}
if(!handle_scroll){
sv.ScrollToVerticalOffset(sv.VerticalOffset - e.VerticalChange);
}
}
else {
handle_scroll = true;
}
}
Обратите внимание на переменную handle_scroll
. Я поставил это на место, потому что вызов sv.ScrollToVerticalOffset
вызовет рекурсивный вызов всей функции inf_scroll
, если ее там не было.
Я знаю плохая практика - прокручивать ScrollViewer
в обработчике ScrollChanged
, поэтому я спрашиваю: есть ли лучший способ сделать это? Как я могу предотвратить рекурсивные вызовы на inf_scroll
? Есть ли лучший способ симулировать «бесконечную прокрутку»?