假如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,查到的博文連結:http://blogs.msdn.com/b/ptorr/archive/2010/10/12/procrastination-ftw-lazylistbox-should-improve-your-scrolling-performance-and-responsiveness.aspx