浅谈listbox的分页加载|下拉更新
ListBox的分页加载,相信在很多应用中大家都已经见到过了。但是在WP7开发中,这个功能开发起来似乎是不那么直观(因为没有那么个ScrollEnd事件),我在学习开发这个功能的时候第一步是先百度谷歌Bing的,为了不重复造轮子。其实有很多人都在问这个问,大家的共同关注点只有一个,就是如何判断ListBox的滚动条滚动到了底部,所以,此篇文章我也就只围绕如何判断滚动到底来展开了,其他的部分暂略。我记得曾经看到了一个英文的文章实现了这个效果,写的很复杂,好多好多的类,本人比较懒,就没继续看……,后来从某中文论坛看到了一个非常简单的方法,不得不感叹我们中国人的聪明才智啊。
1 private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) 2 { 3 List<ScrollBar> scrollBarList = GetVisualChildCollection<ScrollBar>(lstBizs); 4 foreach (ScrollBar scrollBar in scrollBarList) 5 { 6 if (scrollBar.Orientation == System.Windows.Controls.Orientation.Horizontal) 7 { 8 9 } 10 else 11 { 12 scrollBar.ValueChanged += new RoutedPropertyChangedEventHandler<double>(verticalScrollBar_ValueChanged); 13 } 14 } 15 } 16 17 18 private void verticalScrollBar_ValueChanged(object sender, RoutedEventArgs e) 19 { 20 ScrollBar scrollBar = (ScrollBar)sender; 21 object valueObj = scrollBar.GetValue(ScrollBar.ValueProperty); 22 object maxObj = scrollBar.GetValue(ScrollBar.MaximumProperty); 23 if (valueObj != null && maxObj != null) 24 { 25 double value = (double)valueObj; 26 double max = (double)maxObj - 1.0; 27 if (value >= max) 28 { 29 //读取下一页的数据 30 } 31 } 32 } 33 34 ? 35 public static List<T> GetVisualChildCollection<T>(object parent) where T : UIElement 36 { 37 List<T> visualCollection = new List<T>(); 38 GetVisualChildCollection(parent as DependencyObject, visualCollection); 39 return visualCollection; 40 } 41 private static void GetVisualChildCollection<T>(DependencyObject parent, List<T> visualCollection) where T : UIElement 42 { 43 int count = VisualTreeHelper.GetChildrenCount(parent); 44 for (int i = 0; i < count; i++) 45 { 46 DependencyObject child = VisualTreeHelper.GetChild(parent, i); 47 if (child is T) 48 { 49 visualCollection.Add(child as T); 50 } 51 else if (child != null) 52 { 53 GetVisualChildCollection(child, visualCollection); 54 } 55 } 56 }
这个代码非常的简洁精悍,并非我原创,但我直接拿过来之后发现它运行的很好,真的很好用。我唯一的一点修改就是“double max = (double)maxObj - 1.0; ”,这里说明一下,value是ScrollBar当前的值,max可想而知是最大值,但是如果当用户把滚动条拉到底部才开始加载下页数据,会明显的出现一个停顿,所以我设定的规则是“当用户把滚动条拉到倒数第一行的时候就开始加载下页数据”,1.0的这个值按需求修改就好了。