ListBox的分頁載入,相信在很多應用中大家都已經見到過了。但是在WP7開發中,這個功能開發起來似乎是不那麼直觀(因為沒有那麼個ScrollEnd事件),我在學習開發這個功能的時候第一步是先百度GoogleBing的,為了不重複造輪子。其實有很多人都在問這個問,大家的共同關注點只有一個,就是如何判斷ListBox的捲軸滾動到了底部,所以,此篇文章我也就只圍繞如何判斷滾動到底來展開了,其他的部分暫略。我記得曾經看到了一個英文的文章實現了這個效果,寫的很複雜,好多好多的類,本人比較懶,就沒繼續看……,後來從某中文論壇看到了一個非常簡單的方法,不得不感歎我們中國人的聰明才智啊。
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) { List<ScrollBar> scrollBarList = GetVisualChildCollection<ScrollBar>(lstBizs); foreach (ScrollBar scrollBar in scrollBarList) { if (scrollBar.Orientation == System.Windows.Controls.Orientation.Horizontal) { } else { scrollBar.ValueChanged += new RoutedPropertyChangedEventHandler<double>(verticalScrollBar_ValueChanged); } } } private void verticalScrollBar_ValueChanged(object sender, RoutedEventArgs e) { ScrollBar scrollBar = (ScrollBar)sender; object valueObj = scrollBar.GetValue(ScrollBar.ValueProperty); object maxObj = scrollBar.GetValue(ScrollBar.MaximumProperty); if (valueObj != null && maxObj != null) { double value = (double)valueObj; double max = (double)maxObj - 1.0; if (value >= max) { //讀取下一頁的資料 } } }
public static List<T> GetVisualChildCollection<T>(object parent) where T : UIElement { List<T> visualCollection = new List<T>(); GetVisualChildCollection(parent as DependencyObject, visualCollection); return visualCollection; } private static void GetVisualChildCollection<T>(DependencyObject parent, List<T> visualCollection) where T : UIElement { int count = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < count; i++) { DependencyObject child = VisualTreeHelper.GetChild(parent, i); if (child is T) { visualCollection.Add(child as T); } else if (child != null) { GetVisualChildCollection(child, visualCollection); } } }
這個代碼非常的簡潔精悍,並非我原創,但我直接拿過來之後發現它啟動並執行很好,真的很好用。我唯一的一點修改就是“double max = (double)maxObj - 1.0; ”,這裡說明一下,value是ScrollBar當前的值,max可想而知是最大值,但是如果當使用者把捲軸拉到底部才開始載入下頁資料,會明顯的出現一個停頓,所以我設定的規則是“當使用者把捲軸拉到倒數第一行的時候就開始載入下頁資料”,1.0的這個值按需求修改就好了。