UWP的一种下拉刷新实现

我们最近实现了一个在UWP中使用的下拉刷新功能,以满足用户的需求,因为这是下拉刷新是一种常见的操作方式,而UWP本身并不提供这一机制。

nuget链接:https://www.nuget.org/packages/PullToRefresh.UWP

并且,我们实现的这一下拉刷新功能,具有以下优点:

  • 支持自定义下拉头部,包括及时显示下拉进度,分辨率较高。
  • 通过ScrollViewer实现,扩展性比较好,且操作界面和ScrollViewer一致,DependencyProperty也是bindable的。
  • 用于ListView时,不影响UI虚拟化的效果。

使用效果如图:

相关代码如下:

<Grid>
  <pr:PullToRefreshListView x:Name="ic" RefreshInvoked="ic_RefreshInvoked">
    <pr:PullToRefreshListView.TopIndicatorTemplate>
      <DataTemplate>
        <Grid Background="LightBlue"
              Height="130"
              Width="200">
          <pr:PullRefreshProgressControl Progress="{Binding}"
                                         HorizontalAlignment="Center"
                                         VerticalAlignment="Bottom">
            <pr:PullRefreshProgressControl.Template>
              <ControlTemplate>
                <Grid>
                  <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="VisualStateGroup">
                      <VisualState x:Name="Normal" />
                      <VisualState x:Name="ReleaseToRefresh">
                        <Storyboard>
                          <ObjectAnimationUsingKeyFrames Storyboard.TargetName="txt" Storyboard.TargetProperty="Text">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="释放刷新" />
                          </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                      </VisualState>
                    </VisualStateGroup>
                  </VisualStateManager.VisualStateGroups>

                  <Grid.RowDefinitions>
                    <RowDefinition Height="auto" />
                    <RowDefinition Height="auto" />
                  </Grid.RowDefinitions>

                  <TextBlock x:Name="txt"
                             Text="下拉刷新"
                             Grid.Row="1"
                             FontSize="20"
                             HorizontalAlignment="Center" />
                  <TextBlock Text="{Binding}"
                             FontSize="24"
                             Foreground="Gray"
                             HorizontalAlignment="Center" />

                </Grid>
              </ControlTemplate>
            </pr:PullRefreshProgressControl.Template>
          </pr:PullRefreshProgressControl>

        </Grid>

      </DataTemplate>
    </pr:PullToRefreshListView.TopIndicatorTemplate>

    <pr:PullToRefreshListView.ItemContainerStyle>
      <Style TargetType="ListViewItem">
        <Setter Property="HorizontalAlignment" Value="Center" />
      </Style>
    </pr:PullToRefreshListView.ItemContainerStyle>
    <pr:PullToRefreshListView.ItemTemplate>
      <DataTemplate>
        <Rectangle Width="100" Height="200">
          <Rectangle.Fill>
            <SolidColorBrush Color="{Binding}" />
          </Rectangle.Fill>
        </Rectangle>
      </DataTemplate>
    </pr:PullToRefreshListView.ItemTemplate>

  </pr:PullToRefreshListView>
</Grid>

可以看到,只要在<pr:PullToRefreshListView.TopIndicatorTemplate>中定义DataTemplate作为下拉头部模板即可,Binding是指触发刷新的下拉百分比。

刷新函数通过PullToRefreshListView.RefreshInvoked函数进行。

下拉阈值通过PullToRefreshListView.RefreshThreshold设置,类型是double,表示像素。不过Binding到头部的是百分比。

PullRefreshProgressControl是自带的一种头部控件,可以为它设置Template哦。它具有一个VisualState:ReleaseToRefresh,表示已触发刷新,松开就可以刷新了(推回去就不刷新)。

当然可以完全自定义下拉头部。

如果只需要基本的ScrollViewer,可以将pr:PullToRefreshListView替换成pr:PullToRefreshScrollViewer,具有同样的操作界面。

将其他ControlTemplate中的ScrollViewer替换成pr:PullToRefreshScrollViewer,也能将下拉刷新集成在别的控件里:

<ControlTemplate TargetType="local:PullToRefreshListView">
  <Border BorderBrush="{TemplateBinding BorderBrush}"
          BorderThickness="{TemplateBinding BorderThickness}"
          Background="{TemplateBinding Background}">
    <local:PullToRefreshScrollViewer x:Name="PullToRefreshScrollViewer"
                                     AutomationProperties.AccessibilityView="Raw"
                                     ScrollViewer.BringIntoViewOnFocusChange="{TemplateBinding ScrollViewer.BringIntoViewOnFocusChange}"
                                     ScrollViewer.HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}"
                                     ScrollViewer.HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
                                     ScrollViewer.IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}"
                                     ScrollViewer.IsHorizontalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsHorizontalScrollChainingEnabled}"
                                     ScrollViewer.IsVerticalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsVerticalScrollChainingEnabled}"
                                     ScrollViewer.IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}"
                                     ScrollViewer.IsDeferredScrollingEnabled="{TemplateBinding ScrollViewer.IsDeferredScrollingEnabled}"
                                     TabNavigation="{TemplateBinding TabNavigation}"
                                     ScrollViewer.VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"
                                     ScrollViewer.VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}"
                                     ScrollViewer.ZoomMode="{TemplateBinding ScrollViewer.ZoomMode}"
                                     TopIndicatorTemplate="{TemplateBinding TopIndicatorTemplate}"
                                     RefreshThreshold="{TemplateBinding RefreshThreshold}">
      <ItemsPresenter FooterTransitions="{TemplateBinding FooterTransitions}"
                      FooterTemplate="{TemplateBinding FooterTemplate}"
                      Footer="{TemplateBinding Footer}"
                      HeaderTemplate="{TemplateBinding HeaderTemplate}"
                      Header="{TemplateBinding Header}"
                      HeaderTransitions="{TemplateBinding HeaderTransitions}"
                      Padding="{TemplateBinding Padding}" />
    </local:PullToRefreshScrollViewer>
  </Border>
</ControlTemplate>

对于ScrollViewer提供的Attached DependencyProperty,pr:PullToRefreshScrollViewer继续沿用,以保持外层控件的原有设定。binding时需要注意。

已知问题

  • PullToRefreshListView不具有自动增量加载的效果
  • PullToRefreshScrollViewer的部分属性,如BringIntoViewOnFocusChange无效。

nuget链接:https://www.nuget.org/packages/PullToRefresh.UWP

如果大家在使用中遇到了什么问题,希望能向我们反馈,以使得我们的实现变得更好。

时间: 2024-11-08 13:07:51

UWP的一种下拉刷新实现的相关文章

Adnroid 两种下拉刷新 方式的实现 sina刷新 gmail刷新

sina刷新 这种下拉刷新的方式是比较简单的.上个图: 这种刷新方式的思路是这样的: 首先是需要一个HeaderVIew也就是刷新时头部所显示出来的数据.这个view的布局随你,长啥样自己定夺. 其他不是特别重要,重要的是用户触摸事件的捕捉,看到github上的大神的一些方法是比较正规的,我就自己用自己的方法尝试,主要是捕捉到用户的点击事件来计算用户所触摸到的位置然后来更新头部布局的位置. 这个重要的代码贴出来: case MotionEvent.ACTION_MOVE: currentY =

Android UI- PullToRrefresh自定义下拉刷新动画

Android UI- PullToRrefresh自定义下拉刷新动画 如果觉得本文不错,麻烦投一票,2014年博客之星投票地址:http://vote.blog.csdn.net/blogstar2014/details?username=wwj_748#content 本篇博文要给大家分享的是如何使用修改开源项目PullToRrefresh下拉刷新的动画,来满足我们开发当中特定的需求,我们比较常见的一种下拉刷新样式可能是以下这种: 就是下拉列表的时候两个箭头上下翻转,更改日期文本和刷新状态,

慕课网app下拉刷新图标填充效果的实现

之前看到一种下拉刷新的效果,与以往的下拉效果都不一样,大多数下拉刷新都是一个圆形进度条在旋转,而这个下拉刷新则是一个不断填充的效果.本以为这是个自定义View,后来反编译慕课网的app后提取资源的时候看到好多的图片,那大概慕课网app内部的实现应该是帧动画达到这种效果.而当我看到这种效果的时候,由于前段时间在学自定义控件,所以本能的反应则是自定义的.首先我们看下慕课网的效果.如下图 而我的也实现了一个这个图标填充的简单版.如下图 整个实现使用图形的混合模式+贝塞尔曲线,贝塞尔曲线的绘制参考自爱哥

微信小程序-自定义QQ版下拉刷新

最近给别个公司做技术支持,要实现微信小程序上拉刷新与下拉加载更多 微信给出的接口不怎么友好,最终想实现效果类似QQ手机版 ,一共3种下拉刷新状态变化,文字+图片+背景颜色 最终实现后的效果(这里提示有个不同点就是,自定义了导航条,并且下拉的时候,自定义导航条必须固定) 小程序实现下拉加载2种方式: 1. 简单粗暴,直接开启enablePullDownRefresh,开启全局下拉刷新 2.利用scroll-view组件 简单分析下2种方式的利与弊 enablePullDownRefresh方式 优

(UWP开发)更为合理的一种ListView下拉刷新(PullToRefresh)实现方法

最近在做的一个项目需要用到下拉刷新,但是参考了现在网络上比较普遍的方法,觉得都不太好,因为要在外部套上一个SrollViewer,容易出现滚动错误.于是刚开始的时候就把思路定到了ListView内部的ScrollViewer上. 最初的想法是在ScrollViewer的Manipulation相关事件上下手,确实做好了,效果也不错,如图: 当时得意满满的看着自己的作品,心里是说不出的激动啊,结果放在手机上想试试触屏设备的效果,结果发现好坑爹:在触屏设备上,手指在ListView的上下滑动默认是移

UWP开发入门(七)——下拉刷新

本篇意在给这几天Win10 Mobile负面新闻不断的某软洗地,想要证明实现一个简单的下拉刷新并不困难.UWP开发更大的困难在于懒惰,缺乏学习的意愿.而不是“某软连下拉刷新控件都没有”这样的想法. 之前我也没有进行过下拉刷新的研究.于是先去google了几篇blog学习了一下,然后再看了某软官方的Sample.(同学们啊官方有下拉刷新的Sample啊!就在Git上啊!不要钱无门槛啊!)学习之后发现实现的方式大体分为两类. 一类是以某软Sample和博客园MS-UAP封装的PullToRefres

上拉刷新和下拉刷新的两种方法(包括使用第三方库MJRefresh)

一.使用苹果原生的方法 1.下拉刷新 2.上拉刷新 (1 首先要新建一个footer得XIB文件,当然同时包括对应的控制器文件,例如在XIB文件中可以如下拖拉对应的控件 (2 然后在代码文件中写一个实例方法 +(instancetype)footer { return  [[[NSBundle mainBundle] loadNibNamed:@"XIB文件名" owner:nil options:nil] lastObject]; } (3 然后在我们的列表控制器中调用: /** *

UWP 下拉刷新控件(PullToRefreshControl)

最近项目里面有下拉刷新的需求,自己做了一个,效果还不错. <Style TargetType="local:PullToRefreshControl"> <Setter Property="HeaderTemplate"> <Setter.Value> <DataTemplate> <Grid> <StackPanel VerticalAlignment="Center" Orie

自定义下拉刷新控件

一.功能效果 1.在很多app中,在信息展示页面,当我们向下拖拽时,页面会加载最新的数据,并有一个短暂的提示控件出现,有些会有加载进度条,有些会记录加载日期.条目,有些还带有加载动画.其基本实现原理都相仿,本文中将探讨其实现原理,并封装出一个简单的下拉刷新控件 2.自定义刷新工具简单的示例 二.系统提供的下拉刷新工具 1.iOS6.0以后系统提供了自己的下拉刷新的控件:UIRefreshControl .例如,refreshControl,作为UITableViewController中的一个属