您的位置:首页 > 其它

在win8中如何实现下拉刷新的功能

2013-07-10 14:52 423 查看


现在我以listview为例来讲述下拉刷新的功能!

在xaml中设置listview一定要设置一个这样的属性,IsSwipeEnabled=false,然后再listview控件的前面要布局下拉刷新的图标及提示,在listview控件的后面也要布局上拉时的提示信息。

现在我将个人的布局展现出来,仅供大家参考!

<GridName="layoutCtlRoot"MinWidth="240">
<Grid.RowDefinitions>
<RowDefinitionHeight="Auto"></RowDefinition>
<RowDefinitionHeight="*"></RowDefinition>
<RowDefinitionHeight="Auto"></RowDefinition>
</Grid.RowDefinitions>
<BorderName="recRefresh"Height="0"Margin="0"MaxHeight="800"VerticalAlignment="Bottom">
<Grid>
<GridMargin="10"VerticalAlignment="Bottom">
<Grid.ColumnDefinitions>
<ColumnDefinitionWidth="64"/>
<ColumnDefinitionWidth="*"/>
</Grid.ColumnDefinitions>
<StackPanelVerticalAlignment="Bottom"HorizontalAlignment="Center">
<ImageName="imgArrow"Style="{StaticResourceProgressArrowStyle}">
<Image.RenderTransform>
<RotateTransformx:Name="imageRotateTransform"Angle="0"/>
</Image.RenderTransform>
</Image>
<ProgressRingName="prgRefresh"Style="{StaticResourceProgressRingStyle}"/>
</StackPanel>
<StackPanelVerticalAlignment="Bottom"Grid.Column="1">
<TextBlockName="txtOperationTip"Style="{StaticResourceTipsContentStyle}"/>
<TextBlockName="txtOperationTime"Style="{StaticResourceTipsContentStyle}"/>
</StackPanel>
</Grid>
<BorderBackground="#99999999"VerticalAlignment="Bottom"Height="1"/>
</Grid>
</Border>
<ListViewName="ForumList"Grid.Row="1"IsSwipeEnabled="False"ItemContainerStyle="{StaticResourceListItemBaseStyle}"/>
<BorderName="recLoad"Height="0"Grid.Row="2"MaxHeight="800">
<GridVerticalAlignment="Top"Margin="0,10">
<BorderBackground="#99999999"VerticalAlignment="Top"Height="1"/>
<StackPanelName="splNextPageLoading"HorizontalAlignment="Center"Orientation="Horizontal"Visibility="Collapsed">
<ProgressRingStyle="{StaticResourceProgressRingStyle}"Visibility="Visible"/>
<TextBlockText="正在加载…"Margin="13"Style="{StaticResourceTipsContentStyle}"/>
</StackPanel>
</Grid>
</Border>
</Grid>


然后在后台就要实现下拉刷新的正真效果呢!

这里特别要指出的要注册这样一个事件,this.LayoutUpdated+=ForumList_LayoutUpdated;不然就实现不了!

也要注册listview的触摸事件,例如:

this.ForumList.ManipulationStarted+=ForumList_ManipulationStarted;
this.ForumList.ManipulationDelta+=ForumList_ManipulationDelta;
this.ForumList.ManipulationCompleted+=ForumList_ManipulationCompleted;

思路就是这样的,现在我就讲后台的逻辑也给大家参考!

DispatcherTimertoptimer=newDispatcherTimer();
DispatcherTimertimer=newDispatcherTimer();
privateScrollViewerlistViewScrollViewer;

privatedoublelistviewItemHeight=-1;
privateintoptLimitHeight=96;
privateboolisInPrpcessing=false;

privatePointeventStartPoint;

privatedoublelastDeltaHandledY=0;

privateObservableCollection<dynamic>listDataItems=newObservableCollection<dynamic>();

//移动开始位置
privatePointmoveStartPoint;
//是否可以移动
privateboolcanMove=false;

publicListPage()
{
this.InitializeComponent();

this.imgArrow.Source=newBitmapImage(newUri(@"ms-appx:///Assets/pullrefresh_arrow.png",UriKind.RelativeOrAbsolute));
this.LayoutUpdated+=ForumList_LayoutUpdated;
this.recRefresh.SizeChanged+=recRefresh_SizeChanged;
this.ForumList.ManipulationStarted+=ForumList_ManipulationStarted;
this.ForumList.ManipulationDelta+=ForumList_ManipulationDelta;
this.ForumList.ManipulationCompleted+=ForumList_ManipulationCompleted;
//this.ForumList.SelectionChanged+=ForumList_SelectionChanged;
}


privatevoidForumList_LayoutUpdated(objectsender,objecte)
{
if(this.Height.Equals(double.NaN)&&this.Parent!=null)
{
this.Height=((Windows.UI.Xaml.FrameworkElement)(this.Parent)).ActualHeight;
}

if(listViewScrollViewer==null)
{
listViewScrollViewer=FindVisualElement<ScrollViewer>(VisualTreeHelper.GetParent(this));
listViewScrollViewer.ManipulationMode=ManipulationModes.All;
}

for(inti=0;i<this.ForumList.Items.Count;i++)
{
ListViewItemitem=this.ForumList.ItemContainerGenerator.ContainerFromIndex(i)asListViewItem;

if(item!=null&&item.ManipulationMode!=ManipulationModes.All)
{
item.ManipulationMode=ManipulationModes.All;

if(listviewItemHeight<0)
{
listviewItemHeight=((Windows.UI.Xaml.FrameworkElement)(item)).ActualHeight;
}
}
}
}

privatestaticTFindVisualElement<T>(DependencyObjectcontainer)whereT:DependencyObject
{
Queue<DependencyObject>childQueue=newQueue<DependencyObject>();
childQueue.Enqueue(container);

while(childQueue.Count>0)
{
DependencyObjectcurrent=childQueue.Dequeue();

Tresult=currentasT;
if(result!=null&&result!=container)
{
returnresult;
}

intchildCount=VisualTreeHelper.GetChildrenCount(current);
for(intchildIndex=0;childIndex<childCount;childIndex++)
{
childQueue.Enqueue(VisualTreeHelper.GetChild(current,childIndex));
}
}

returnnull;
}


privatevoidrecRefresh_SizeChanged(objectsender,SizeChangedEventArgse)
{
if(e.NewSize.Height>this.optLimitHeight&&!isInPrpcessing)
{
if(!this.txtOperationTip.Text.Equals("松开刷新…"))
{
this.txtOperationTip.Text="松开刷新…";
this.ImgStoryBoard.Begin();
}
}
}

privatevoidForumList_ManipulationStarted(objectsender,ManipulationStartedRoutedEventArgse)
{
eventStartPoint=e.Position;
lastDeltaHandledY=0;
if(!isInPrpcessing)
{
this.txtOperationTip.Text="下拉刷新列表…";
}
e.Handled=true;
}
privatevoidForumList_ManipulationDelta(objectsender,ManipulationDeltaRoutedEventArgse)
{
doubleoffset=e.Cumulative.Translation.Y-lastDeltaHandledY;
if(listViewScrollViewer.VerticalOffset<3)
{
doubleheight=recRefresh.Height+offset;
recRefresh.Height=height>0?height:0;
if(offset<0&&recRefresh.Height<=0)
{
//向上滑动且刷新Panel未显示时滚动条下移
listViewScrollViewer.ScrollToVerticalOffset(listViewScrollViewer.VerticalOffset-offset/listviewItemHeight);
}
}
elseif(listViewScrollViewer.VerticalOffset>=listViewScrollViewer.ScrollableHeight-1)
{
doubleheight=recLoad.Height-offset;
recLoad.Height=height>0?height:0;
if(offset>0&&recLoad.Height<=0)
{
listViewScrollViewer.ScrollToVerticalOffset(listViewScrollViewer.VerticalOffset-offset/listviewItemHeight);
}
}
else
{
listViewScrollViewer.ScrollToVerticalOffset(listViewScrollViewer.VerticalOffset-offset/listviewItemHeight);
}
lastDeltaHandledY=e.Cumulative.Translation.Y;
e.Handled=true;
}

privatevoidForumList_ManipulationCompleted(objectsender,ManipulationCompletedRoutedEventArgse)
{
if(listViewScrollViewer!=null)
{
doubleoffset=listViewScrollViewer.VerticalOffset;
doubletotal=listViewScrollViewer.ScrollableHeight;
if(offset<=3||offset>total-2)
{
DoListItemsSwipe();
}
}
}
///<summary>
///数据加载后是否可下拉刷新
///</summary>
publicstaticreadonlyDependencyPropertyRefreshableProperty=DependencyProperty.Register("Refreshable",typeof(bool),typeof(ListPage),newPropertyMetadata(true));
publicboolRefreshable
{
get
{
return(bool)base.GetValue(RefreshableProperty);
}
set
{
base.SetValue(RefreshableProperty,value);

if(!value)
{
this.imgArrow.Visibility=Windows.UI.Xaml.Visibility.Collapsed;
this.prgRefresh.Visibility=Windows.UI.Xaml.Visibility.Collapsed;
this.txtOperationTip.Visibility=Windows.UI.Xaml.Visibility.Collapsed;
this.txtOperationTime.Visibility=Windows.UI.Xaml.Visibility.Collapsed;
}
}
}
privatevoidDoListItemsSwipe()
{
if(recRefresh.Height>0)
{
if(recRefresh.Height>optLimitHeight&&this.Refreshable)
{
recRefresh.Height=96;
imgArrow.Visibility=Visibility.Collapsed;
prgRefresh.Visibility=Visibility.Visible;
if(!this.isInPrpcessing)
{
System.Diagnostics.Debug.WriteLine(this.isInPrpcessing);
DoListDataSourceRefresh();
}
}
else
{
recRefresh.Height=0;
}
listViewScrollViewer.ScrollToVerticalOffset(2.05);
}
if(recLoad.Height>0)
{
if(recLoad.Height>optLimitHeight)
{
recLoad.Height=68;
splNextPageLoading.Visibility=Visibility.Visible;
if(!this.isInPrpcessing)
{
DoListDataLoadNextPage();
}
}
else
{
recLoad.Height=0;
}
}
}
privatevoidDoListDataSourceRefresh()
{

this.isInPrpcessing=true;
this.txtOperationTip.Text="加载数据中";
this.isInPrpcessing=false;
this.recRefresh.Height=0;
this.imgArrow.Visibility=Windows.UI.Xaml.Visibility.Visible;
this.prgRefresh.Visibility=Windows.UI.Xaml.Visibility.Collapsed;
this.ImgStoryBoard.Begin();//箭头复位
}
privatevoidDoListDataLoadNextPage()
{
this.recLoad.Height=0;
splNextPageLoading.Visibility=Windows.UI.Xaml.Visibility.Collapsed;
}
publiceventSelectionChangedEventHandlerSelectionChanged;
privatevoidForumList_SelectionChanged(objectsender,SelectionChangedEventArgse)
{
SelectionChanged(sender,e);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐