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

c# – ListView中的“无限滚动”避免可重入滚动事件,第1张

概述我的目标是在 WPF ListView中模拟“无限滚动”.我用一些不太理想的方法完成了这项任务,我确信有更好的方法来做到这一点. 通过“无限滚动”我的意思是: 假设ListView有20个项目(订购1,2,3,4,…… 17,18,19,20).当用户向下滚动一个项目时,ListView顶部的项目将被删除并放置在ListView的末尾,因此项目的顺序为2,3,4,5,… 18,19,20, 1.现 我的目标是在 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事件,我希望它是“无限的”:

// 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函数被递归调用(如果不存在的话).

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

解决方法 虽然它没有明确地避免在ScrollChanged处理程序中滚动,但您可以尝试以下 *** 作:
// sv - the ScrollVIEwer to which this event handler is Listening// lv - the ListVIEw associated with "sv"private voID inf_scroll(object sender,ScrollChangedEventArgs e) {    for (int i = 0; i < e.VerticalChange; i++) {        object tmp = lv.Items[0];        lv.Items.RemoveAt(0);        lv.Items.Add(tmp);    }    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);    }    lv.ScrollChanged -= inf_scroll;        // remove the handler temporarily    sv.ScrollToVerticalOffset(sv.VerticalOffset - e.VerticalChange);    dispatcher.BeginInvoke(dispatcherPriority.Send,new Action(() =>{        sv.ScrollChanged += inf_scroll;    // add the handler back after the scrolling has occurred to avoID recursive scrolling    }));}
总结

以上是内存溢出为你收集整理的c# – ListView中的“无限滚动”/避免可重入滚动事件全部内容,希望文章能够帮你解决c# – ListView中的“无限滚动”/避免可重入滚动事件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1244765.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存