c# – ListView中的“无限滚动”/避免可重入滚动事件

前端之家收集整理的这篇文章主要介绍了c# – ListView中的“无限滚动”/避免可重入滚动事件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的目标是在 WPF ListView中模拟“无限滚动”.我用一些不太理想的方法完成了这项任务,我确信有更好的方法来做到这一点.

通过“无限滚动”我的意思是:

假设ListView有20个项目(订购1,2,3,4,…… 17,18,19,20).当用户向下滚动一个项目时,ListView顶部的项目将被删除并放置在ListView的末尾,因此项目的顺序为2,5,… 18,20,1.现在,如果用户向下滚动两个项目,则前两个项目被移除并放置在最后,因此项目的顺序是4,6,7,… 20,1,3.现在,类似地,如果用户向上滚动一个项目,则ListView底部的项目将被删除并放置在开头,因此项目的顺序为3,… 19,2 .

我已经完成了这个任务,并将以下函数分配给ScrollViewer的ScrollChanged事件,我希望它是“无限的”:

  1. // sv - the ScrollViewer to which this event handler is listening
  2. // lv - the ListView associated with "sv"
  3. bool handle_scroll = true;
  4. private void inf_scroll(object sender,ScrollChangedEventArgs e) {
  5. if (handle_scroll) {
  6. for (int i = 0; i < e.VerticalChange; i++) {
  7. object tmp = lv.Items[0];
  8. lv.Items.RemoveAt(0);
  9. lv.Items.Add(tmp);
  10. handle_scroll = false;
  11. }
  12. for (int i = 0; i > e.VerticalChange; i--) {
  13. object tmp = lv.Items[lv.Items.Count - 1];
  14. lv.Items.RemoveAt(lv.Items.Count - 1);
  15. lv.Items.Insert(0,tmp);
  16. handle_scroll = false;
  17. }
  18. if(!handle_scroll){
  19. sv.ScrollToVerticalOffset(sv.VerticalOffset - e.VerticalChange);
  20. }
  21. }
  22. else {
  23. handle_scroll = true;
  24. }
  25. }

注意变量handle_scroll.我把它放到位是因为对sv.ScrollToVerticalOffset的调用将导致整个inf_scroll函数被递归调用(如果不存在的话).

我知道在ScrollChanged事件处理程序中滚动ScrollViewer是不好的做法,这就是我要问的原因:有更好的方法吗?如何阻止对inf_scroll的递归调用?有没有更好的方法来模拟“无限滚动”?

解决方法

虽然它没有明确地避免在ScrollChanged处理程序中滚动,但您可以尝试以下操作:
  1. // sv - the ScrollViewer to which this event handler is listening
  2. // lv - the ListView associated with "sv"
  3. private void inf_scroll(object sender,ScrollChangedEventArgs e) {
  4. for (int i = 0; i < e.VerticalChange; i++) {
  5. object tmp = lv.Items[0];
  6. lv.Items.RemoveAt(0);
  7. lv.Items.Add(tmp);
  8. }
  9. for (int i = 0; i > e.VerticalChange; i--) {
  10. object tmp = lv.Items[lv.Items.Count - 1];
  11. lv.Items.RemoveAt(lv.Items.Count - 1);
  12. lv.Items.Insert(0,tmp);
  13. }
  14. lv.ScrollChanged -= inf_scroll; // remove the handler temporarily
  15. sv.ScrollToVerticalOffset(sv.VerticalOffset - e.VerticalChange);
  16. Dispatcher.BeginInvoke(DispatcherPriority.Send,new Action(() =>{
  17. sv.ScrollChanged += inf_scroll; // add the handler back after the scrolling has occurred to avoid recursive scrolling
  18. }));
  19. }

猜你在找的C#相关文章