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

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

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

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

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

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

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

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

        <ScrollViewer x:Name="scrollViewer"
                     Loaded="scrollViewer_Loaded"
                      ViewChanged="scrollViewer_ViewChanged">

            <StackPanel Orientation="Vertical">
                <ProgressRing IsActive="{x:Bind IsPullRefresh,Mode=OneWay}" Height="30"></ProgressRing>
                <ListView x:Name="list" ItemsSource="{x:Bind Items}" ></ListView>
            </StackPanel>

        </ScrollViewer>
    </Grid>

  再来看cs文件。首先是Items和IsPullRefresh属性的定义,前者是ListView中的数据集,后者Binding到ProgressRing的IsActive属性,这里略过不表。

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

    public sealed partial class 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);
        }

        private async void 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;
            }
        }
    }

  打完收工,是不是觉得挺简单的?UWP开发即是如此,困难确实有,经验的确没有。跟相对成熟的iOS和Android开发相比,是需要更多的汗水和努力。但是微软是否要倒了?微软技术又是否没前途?Windows 10是否废品?有空在网上搜这种没有卵用的东西,不如多多学习。

  继续打广告,这种ScrollViewer嵌套ListView的方式呢,确实可以解决问题。但偶尔也会发现和ListView控件自身的ScrollViewer滑动冲突,以及不能精确定位ListViewItem等问题。那么如果想要更加精进的话?记得看俺下一篇哦,随手点个赞吧……嘿嘿嘿……

Microsoft/Windows-universal-samples

时间: 2024-10-01 00:55:42

UWP开发入门(七)——下拉刷新的相关文章

UWP的一种下拉刷新实现

我们最近实现了一个在UWP中使用的下拉刷新功能,以满足用户的需求,因为这是下拉刷新是一种常见的操作方式,而UWP本身并不提供这一机制. nuget链接:https://www.nuget.org/packages/PullToRefresh.UWP 并且,我们实现的这一下拉刷新功能,具有以下优点: 支持自定义下拉头部,包括及时显示下拉进度,分辨率较高. 通过ScrollViewer实现,扩展性比较好,且操作界面和ScrollViewer一致,DependencyProperty也是bindabl

使用SVPullToRefresh实现下拉刷新和下拉加载

移动端开发中,“下拉刷新”和“上拉加载更多”早已在各大App中随处可见.也非常容易就能找到直接可供使用的第三方资源.譬如EGOTableViewPullRefresh(下拉刷新)和LoadMoreTableFooterView(上拉加载更多),以及同时提供这两种功能的STableViewController和SVPullToRefresh.笔者都有所接触,我比较喜欢使用的是SVPullToRefresh,它以category形式对UIScrollView进行功能扩充,使用方便,并且代码逻辑简单,

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

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

android开发游记:SpringView 下拉刷新的高效解决方案,定制你自己风格的拖拽页面

关于下拉刷新/上拉加载更多的解决方案网上已经有很多了,浏览了目前主流的下拉控件比如PullToRefresh库等,第一:大多数实现库都难以进行动画和样式的自定义.第二:不能很好的兼容多种滚动控件,它们都对listView.RecyclerView等进行了不同程度的重新实现,你在项目中就得使用库提供的PullToRefreshListView.PullToRefreshRecyclerView等来代替源生的listView.RecyclerView等,这样的方式其实并不好,随着android版本的

IOS 开发下拉刷新和上拉加载更多

IOS 开发下拉刷新和上拉加载更多 简介 1.常用的下拉刷新的实现方式 (1)UIRefreshControl (2)EGOTTableViewrefresh (3)AH3DPullRefresh (4)MJRefresh (5)自己实现 2.AH3DPullRefresh实现下拉刷新和上拉下载的步骤 添加UIScrollView+AH3DPullRefresh.h 和UIScrollView+AH3DPullRefresh.m两个文件,由此可知,它是基于UIScrollView的方法. 在bu

iOS开发项目篇—30下拉刷新

iOS开发项目篇—30下拉刷新 一.网络监控 当应用所处的网络环境不好的时候,获取不到相应的网络数据,考虑到用户对应用的使用体验,有必要对网络的状况进行监听. 在程序启动完的时候,监控网络 YYAppDelegate.m文件代码: 1 // 2 // YYAppDelegate.m 3 // 4 5 #import "YYAppDelegate.h" 6 #import "YYOAuthViewController.h" 7 #import "YYCont

iOS开发用AFNetworking和MJRefresh实现网络请求和下拉刷新、上拉加载

首先感谢iOS122提供的可以免费GET请求到的网络数据的接口 为了方便cell自适应高度,此处的cell是带Xib的.为了方便理解代码,此处没有应用MVC设计模式,实际开发中不能这样. #import "ViewController.h" #import "AFNetworking.h" #import "MJRefresh.h" #import "TestTableViewCell.h" @interface ViewCo

android 开发:使用SwipeRefreshLayout实现下拉刷新

SwipeRefreshLayout google官方的下拉刷新控件,我是使用在ListView上的. 定义布局文件: 1 LinearLayout 2 xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="match_parent" 5 android:layout_h

ionic入门教程第十一课-简要说明ion-list、ion-item完成列表页ion-infinite-scroll上拉加载ion-refresher下拉刷新

发了十篇教程,现在向我问问题的朋友越来越少了.可能我接触到的学习ionic的就这么些人吧! 可能大家已经觉得我写的东西都太过基础了,没什么值得参考借鉴的地方. 开始有人叫我说直接防类似饿了吗,折八百这样的网站,做一个Demo. 其实我也知道有些朋友就想要这种网上的免费劳动力. 但是其实这个建议还是不错的. 等我把现在这个demo讲完,我可能会考虑找一个成熟的上线的项目进行说明. 这个列表页一说,写完这个的朋友就可以尝试着接手项目了. 我不是说ionic简单,内容少. 我只是说我这些时间里面提到的