zoukankan      html  css  js  c++  java
  • Windows Phone 7 如何判断ListBox控件滚动到底

          假如ListBox控件绑定的数据很大的时候,通常会造成加载的速度很慢,那么有一种交互方案可以优化一下这种情况,就是先在ListBox上加载一部分的数据,等到用户查看的时候将ListBox滚动到底的时候再加载一部分数据。但是在ListBox控件里面根本就没有相关的事件和属性来判断出来ListBox什么时候滚动到底了,那么下面讲解一种解决的方法。
         ListBox控件其实是封装了ScrollViewer控件和ScrollBar控件在里面的。那这就好办了,通过获取ListBox控件里面封装的ScrollViewer控件,然后通过ScrollViewer控件的属性就可以判断出来ListBox控件是否滚动到底了。
    下面看一下代码:
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <ListBox Name="listbox1" MouseMove="listbox1_MouseMove" >
    </ListBox>
    </Grid>
    using System;
    using System.Collections.Generic;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Input;
    using System.Windows.Media;
    using Microsoft.Phone.Controls;

    namespace ListBoxUpdate
    {
    public partial class MainPage : PhoneApplicationPage
    {
    public MainPage()
    {
    InitializeComponent();

    for (int i = 0; i < 30; i++)
    {
    listbox1.Items.Add(
    "项目"+i);
    }

    }

    private void listbox1_MouseMove(object sender, MouseEventArgs e)
    {
    //获取listbox的子类型ScrollViewer
    ScrollViewer scrollViewer = FindChildOfType<ScrollViewer>(listbox1);//ScrollViewer scrollBar
    if (scrollViewer == null)
    {
    throw new InvalidOperationException("erro");
    }
    else
    {
    //判断当前滚动的高度是否大于或者等于scrollViewer实际可滚动高度,如果等于或者大于就证明到底了
    if (scrollViewer.VerticalOffset >= scrollViewer.ScrollableHeight)
    {
    //处理listbox滚动到底的事情
    for (int i = 0; i < 10; i++)
    {
    int k = listbox1.Items.Count;
    listbox1.Items.Add(
    "项目" + k);
    k
    ++;
    }
    }
    }
    }

    //获取子类型
    static T FindChildOfType<T>(DependencyObject root) where T : class
    {
    var queue
    = new Queue<DependencyObject>();
    queue.Enqueue(root);

    while (queue.Count > 0)
    {
    DependencyObject current
    = queue.Dequeue();
    for (int i = VisualTreeHelper.GetChildrenCount(current) - 1; 0 <= i; i--)
    {
    var child
    = VisualTreeHelper.GetChild(current, i);
    var typedChild
    = child as T;
    if (typedChild != null)
    {
    return typedChild;
    }
    queue.Enqueue(child);
    }
    }
    return null;
    }
    }
    }
    运行的效果
    不知道大家有没有更加好的解决方法???
      
     下面有高人建议使用一个扩展过的Listbox控件LazyListBox,查到的博文链接:
     
  • 相关阅读:
    494 Target Sum 目标和
    493 Reverse Pairs 翻转对
    492 Construct the Rectangle 构建矩形
    491 Increasing Subsequences 递增子序列
    488 Zuma Game 祖玛游戏
    486 Predict the Winner 预测赢家
    485 Max Consecutive Ones 最大连续1的个数
    483 Smallest Good Base
    Django Form组件
    Django Auth组件
  • 原文地址:https://www.cnblogs.com/linzheng/p/2092789.html
Copyright © 2011-2022 走看看