using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using System.Collections.ObjectModel;
using System.Windows.Media;
using Microsoft.Phone.Tasks;
namespace PhoneApp2
{
public partial class LoadByPage : PhoneApplicationPage
{
// 数据源
private ObservableCollection<Book> bookList;
// 分页大小
private const int pageSize = 20;
// 页码
private int pageIndex = 0;
// 某一页载入完成
private bool loadFinished = false;
// 是否出发了Tap事件
private bool tab = false;
public LoadByPage()
{
InitializeComponent();
// 初始化数数据源
bookList = new ObservableCollection<Book>();
}
// 页面载入完成之后进行数据源的第一次加载,并将其绑定到listBox上
private void PhoneApplicationPage_Loaded_1(object sender, RoutedEventArgs e)
{
pageIndex = 1;
getMoreBooksByPageIndex(pageIndex);
this.listBox1.ItemsSource = bookList;
}
// 分页加载
private void getMoreBooksByPageIndex(int pageIndex)
{
MessageBox.Show("loading");
// 表示当前页数据开始加载,此处的数据可能是从网络加载
loadFinished = false;
for (int i = (pageIndex - 1) * pageSize + 1; i <= pageIndex * pageSize; i++)
{
bookList.Add(new Book { Name = "book_" + i });
}
// 页码自增
this.pageIndex++;
// 表示当前页加载完成,可进行下一次加载
loadFinished = true;
}
/// <summary>
/// 获取T类型控件,树的广度遍历
/// </summary>
/// <typeparam name="T">需要的控件类型</typeparam>
/// <param name="root">控件的根节点</param>
/// <returns>返回符合条件的第一个节点</returns>
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);
}
}
// 如果没找到,返回null
return null;
}
//Tap事件
private void StackPanel_Tap_1(object sender, System.Windows.Input.GestureEventArgs e)
{
tab = true;
}
private void listBox1_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
//如果是tab事件,则不往下执行
if (tab)
{
tab = false;
return;
}
if (loadFinished)
{
//获取listbox的子类型ScrollViewer
ScrollViewer scrollViewer = FindChildOfType<ScrollViewer>(listBox1);
if (scrollViewer == null)
{
throw new InvalidOperationException("error");
}
else
{
//判断当前滚动的高度是否大于或者等于scrollViewer实际可滚动高度,如果等于或者大于就证明到底了
if (scrollViewer.VerticalOffset >= scrollViewer.ScrollableHeight - 0.00001)
{
if (pageIndex < 8)
{
getMoreBooksByPageIndex(pageIndex);
}
else
{
MessageBox.Show("加载完毕");
}
}
}
}
}
private void ContentPanel_DoubleTap(object sender, System.Windows.Input.GestureEventArgs e)
{
tab = true;
}
}
}
【Windows Phone】 001.ListBox滑动到底分页加载
最新推荐文章于 2022-05-20 14:59:42 发布