您的位置:首页 > 其它

《ListBox》———何如实现ListBox下拉刷新和到底部自动加载

2012-06-01 12:38 447 查看
一、下拉刷新
下拉刷新实现思路:
1、定义一个PullDownToRefreshPanel容器控件。为它添加3种状态模板,分别是PullingDownTemplate,ReadyToReleaseTemplate
和RefreshingTemplate,顾名思义分别是显示下拉状态模板,显示松开刷新状态模板和正在刷新中的状态模板。
2、定义自己的ListBox让它继承系统的ListBox,并重写它的Style,把ScrollViewer的ManipulationMode属性设为Conrtrol(必需),
只有这样才能和我们的定义的PullDownToRefreshPanel兼容。ManipulationMode属性系统默认是System;区别就是,System的
滑动效果更好。这里的ListBox的Style定义可以参考安装的SDK目录里面的系统定义,路径大致是:c->Program Files(x86)->
Microsoft SDKs->Windows Phone->v7.1->Design->System.Windows.xaml.

View Code

private 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;

}


接下来根据状态的改变做相应的加载功能,代码如下

void visualStateGroup_CurrentStateChanged(object sender, VisualStateChangedEventArgs e)

{

var visualState = e.NewState.Name;

if (visualState == "NotScrolling")

{

var v1 = _ScrollViewer.ExtentHeight - _ScrollViewer.VerticalOffset;

var v2 = _ScrollViewer.ViewportHeight * 1.5;

if (v1 <= v2 && !custListBox.IsRefreshing)

{

AddString(index, 20);

visualState += "_End";

}

}

}


最后,在页面的loaded里把这些代码串联起来就OK了。如下:

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)

{

if (_IsHookedScrollEvent)

return;

_ScrollViewer = App._ScrollViewer;

if (_ScrollViewer != null)

{

_IsHookedScrollEvent = true;

FrameworkElement element = VisualTreeHelper.GetChild(_ScrollViewer, 0) as FrameworkElement;

if (element != null)

{

VisualStateGroup visualStateGroup = FindVisualState(element, "ScrollStates");

visualStateGroup.CurrentStateChanged += new EventHandler<VisualStateChangedEventArgs>(visualStateGroup_CurrentStateChanged);

}

}

}


本文参考:http://www.hugwp.com/thread-2058-1.html
和Jason Ginchereau的博客

源码:猛击下载

本文版权归作者和卤面网所有,
转载请标明原始出处
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: