HTML5技术

UWP开发入门(七)——下拉刷新 - 楼上那个蜀黍

字号+ 作者:H5之家 来源:H5之家 2016-02-07 11:01 我要评论( )

本篇意在给这几天 Win10 Mobile 负面新闻不断的某软洗地,想要证明实现一个简单的下拉刷新并不困难。 UWP 开发更大的困难在于懒惰,缺乏学习的意愿。而不是某软连下拉刷新控件都没有这样的想法。 之前我也没有进行过下拉刷新的研究。于是先去 google 了几篇

  本篇意在给这几天Win10 Mobile负面新闻不断的某软洗地,想要证明实现一个简单的下拉刷新并不困难。UWP开发更大的困难在于懒惰,缺乏学习的意愿。而不是“某软连下拉刷新控件都没有”这样的想法。

  之前我也没有进行过下拉刷新的研究。于是先去google了几篇blog学习了一下,然后再看了某软官方的Sample。(同学们啊官方有下拉刷新的Sample啊!就在Git上啊!不要钱无门槛啊!)学习之后发现实现的方式大体分为两类。

  一类是以某软Sample和博客园MS-UAP封装的PullToRefreshBox为代表,将一片“释放刷新”区域和一个ListView上下排列放置到一个ScrollView中。初始通过向下滚动ScrollView将“释放刷新”区域上移至不可见,在每次向上滚动显示“释放刷新”区域时,触发ScrollViewViewChanged事件来进行加载新数据。完成新数据加载后,再次将“释放刷新”区域上移隐藏。

  另一类是通过附加属性来获取ListView内部的ScrollView,并检测内部ScrollView的相关Manpulation事件来实现数据刷新。

  考虑到附加属性稍稍超出入门范围,且第一类代码可以写得较为简单。故采用ScrollView嵌套的方法,给出一个极简的下拉刷新实现,虽并不能应对所有的需求,但考虑到30行不到的代码量,绝对你值得拥有!

  首先是XAML的代码,平淡无奇没有任何高深的技巧:

Loaded="scrollViewer_Loaded" ViewChanged

  再来看cs文件。首先是ItemsIsPullRefresh属性的定义,前者是ListView中的数据集,后者BindingProgressRingIsActive属性,这里略过不表。

  值得注意的仅有scrollViewer_LoadedscrollViewer_ViewChanged两个方法。scrollViewerLoad方法里,我们在初始状态下将ScrollViewer向上滚动了30px,正好将ProgressRing隐藏了起来。然后是scrollViewer_ViewChanged方法,IsIntermediate属性指出滑动是否还在进行中,如果不是并且到达顶部了,就去加载新的数据,同时控制ProgressRing的菊花转圈圈。最后,再将ScrollViewer向上滚动30px藏起ProgressRing

MainPage : Page, INotifyPropertyChanged { public ObservableCollection<object> Items { get; set; } public bool IsPullRefresh { get { return _isPullRefresh; } set { _isPullRefresh = value; OnPropertyChanged(nameof(IsPullRefresh)); } } bool _isPullRefresh = false; public MainPage() { this.InitializeComponent(); Items = new ObservableCollection<object>(); for (int i = 0; i < 40; i++) { Items.Add(i); } } public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(string name) { this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); } private void scrollViewer_Loaded(object sender, RoutedEventArgs e) { scrollViewer.ChangeView(null, 30, null); } scrollViewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e) { var sv = sender as ScrollViewer; if (!e.IsIntermediate) { if (sv.VerticalOffset == 0.0) { IsPullRefresh = true; await Task.Delay(2000); for (int i = 0; i < 5; i++) { Items.Insert(0, i); } sv.ChangeView(null, 30, null); } IsPullRefresh = false; } } }

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 【Vue 入门】使用 Vue2 开发一个展示项目列表的应用 - zhangjk

    【Vue 入门】使用 Vue2 开发一个展示项目列表的应用 - zhangjk

    2017-04-30 16:00

  • 在Delphi下使用迅雷APlayer组件进行免注册开发 - Delphi力量

    在Delphi下使用迅雷APlayer组件进行免注册开发 - Delphi力量

    2017-04-28 15:00

  • ABP入门系列(16)——通过webapi与系统进行交互 - 『圣杰』

    ABP入门系列(16)——通过webapi与系统进行交互 - 『圣杰』

    2017-04-25 09:04

  • 随应潮流-基于ABP+Angularjs现代化应用软件开发框架(1)-总体介绍 - 在路在的张

    随应潮流-基于ABP+Angularjs现代化应用软件开发框架(1)-总体介绍 -

    2017-04-22 08:04

网友点评