问题:在使用ListBox时,我们有时想要listbox滚动到页面底部时立即显示下一部分的内容
解决办法:ListBox控件并没有一个事件可以监控其Scroll当前的滑动情况,但ListBox含有ScrollBar子控件,如果我们可以监控其ScrollBar子控件是否移动到了底部,那我们就能监控ListBox是否滚动到了底部
示例:
应用启动时先为ListBox添加50个Item,当Scroll滑动到底部时,自动再添加50个Item
实现:
目录:
1) 创建一个基本应用并添加一个ListBox事件
2) 为ListBox添加事件代码
3) 测试运行
1 创建一个基本应用并添加一个ListBox控件
1) 创建一个基本的Windows Phone应用程序,OS版本7.0
2) 添加ListBox
12 3
2 为ListBox添加事件代码
1) 在PhoneApplicationPage_Loaded事件中为listBox1添加50个Item
1 private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)2 {3 for (int i = 0; i < 50; i++)4 {5 listBox1.Items.Add(i.ToString());6 }
2) 接着找出listBox1中所有的ScrollBar子控
1 private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)2 {3 for (int i = 0; i < 50; i++)4 {5 listBox1.Items.Add(i.ToString());6 }7 //找到listBox1中属于ScrollBar的子控件8 ListscrollBarList = GetVisualChildCollection (listBox1);
其中函数GetVisualChildCollection:
1 //返回parent控件中属于ScrollBar的子控件2 public static ListGetVisualChildCollection (object parent) where T : UIElement3 {4 List visualCollection = new List ();5 //查找parent控件中所有ScrollBar子控件,并通过visualCollection返回6 GetVisualChildCollection(parent as DependencyObject, visualCollection);7 return visualCollection;8 }
1 //查找parent控件中所有ScrollBar子控件,并通过visualCollection返回 2 private static void GetVisualChildCollection(DependencyObject parent, List visualCollection) where T : UIElement 3 { 4 //查找parent的子控件集合中存在的子级数目 5 int count = VisualTreeHelper.GetChildrenCount(parent); 6 for (int i = 0; i < count; i++) 7 { 8 //获取parent控件的i级子控件 9 DependencyObject child = VisualTreeHelper.GetChild(parent, i);10 if (child is T)11 {12 //若子控件属于ScrollBar控件则将之添加到结果List中13 visualCollection.Add(child as T);14 }15 else if (child != null)16 {17 //若子控件不属于ScrollBar控件,且不是null,则使用递归方法再次查询该子控件的子控件18 GetVisualChildCollection(child, visualCollection);19 }20 }21 }
3) 遍历listBox1的所有ScrollBar子控件,并为其绑定ValueChanged事件
1 private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) 2 { 3 for (int i = 0; i < 50; i++) 4 { 5 listBox1.Items.Add(i.ToString()); 6 } 7 //找到listBox1中属于ScrollBar的子控件 8 ListscrollBarList = GetVisualChildCollection (listBox1); 9 //遍历scrollBarList10 foreach (ScrollBar scrollBar in scrollBarList)11 {12 if (scrollBar.Orientation == System.Windows.Controls.Orientation.Horizontal)13 {14 //该ScrollBar是水平显示的15 }16 else17 {18 //绑定该子控件的ValueChanged事件19 scrollBar.ValueChanged += new RoutedPropertyChangedEventHandler (verticalScrollBar_ValueChanged);20 }21 }22 }
其中verticalScrollBar_ValueChanged函数:
1 //ScrollBar的ValueChanged事件 2 private void verticalScrollBar_ValueChanged(object sender, RoutedEventArgs e) 3 { 4 ScrollBar scrollBar = (ScrollBar)sender; 5 //读取ScrollBar的当前值与最大值 6 object valueObj = scrollBar.GetValue(ScrollBar.ValueProperty); 7 object maxObj = scrollBar.GetValue(ScrollBar.MaximumProperty); 8 if (valueObj != null && maxObj != null) 9 {10 double value = (double)valueObj;11 double max = (double)maxObj;12 //当前值接近最大值时 即快滑到底部时13 if (value >= max)14 {15 for (int i = 0; i < 50; i++)16 {17 listBox1.Items.Add(i.ToString());18 }19 }20 }21 }
3 测试运行
说明:
1) 这个办法是从网上找来的,我只是对其做了一些注释便于理解。
2) 这个方法其实不太好使,用户体验的感觉没有新浪微博的Android客户端那么流畅,希望有牛人能改进一下