很多情况下出于性能的考虑,需要listbox滑动到底部的时候再去加载数据,如下实现
public partial class MainPage : PhoneApplicationPage
{
// Constructor
public MainPage()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
}
bool alreadyHookedScrollEvents = false;
int i;
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
if (alreadyHookedScrollEvents)
return;
alreadyHookedScrollEvents = true;
ScrollViewer viewer = FindSimpleVisualChild<ScrollViewer>(listBox1 );
if (viewer != null)
{
// Visual States are always on the first child of the control template
FrameworkElement element = VisualTreeHelper.GetChild(viewer, 0) as FrameworkElement;
if (element != null)
{
VisualStateGroup group = FindVisualState(element, "ScrollStates");
if (group != null)
{
group.CurrentStateChanging += (s, args) =>
{
PageTitle.Text = args.NewState.Name;
if (viewer.VerticalOffset >= viewer.ScrollableHeight)
{
i ++;
listBox1.Items.Add("新项" + i.ToString());
}
};
}
}
}
}
VisualStateGroup FindVisualState(FrameworkElement element, string name)
{
if (element == null)
return null;
IList groups = VisualStateManager.GetVisualStateGroups(element);
foreach (VisualStateGroup group in groups)
if (group.Name == name)
return group;
return null;
}
T FindSimpleVisualChild<T>(DependencyObject element) where T : class
{
while (element != null)
{
if (element is T)
return element as T;
element = VisualTreeHelper.GetChild(element, 0);
}
return null;
}
}