zoukankan      html  css  js  c++  java
  • Windows Phone开发经验谈(18)总结两种滚动条到底部加载数据的方法

        如今大多数手机用户所关心的网络流量的消耗,当你的App涉及到从网络服务中获取数据,应该尽可能以最有效的方式。让用户等待,就算你的应用程序下载大量的数据不会影响用户体验。而不是让你的App只下载少量的数据。今天我就来和大家介绍下WP中两种让滚动条到底部后再加载数据的方法。

    一、

        我先介绍第一种方法,贴出几个关键代码用于查找控件。

            public static T FindFirstChildOfType<T>(DependencyObject root) where T : class
            {
                Queue<DependencyObject> queue = new Queue<DependencyObject>();
                queue.Enqueue(root);
                while (0 < queue.Count)
                {
                    DependencyObject dependencyObject = queue.Dequeue();
                    if (dependencyObject == null)
                    {
                        return default(T);
                    }
                    int num = VisualTreeHelper.GetChildrenCount(dependencyObject) - 1;
                    while (0 <= num)
                    {
                        DependencyObject child = VisualTreeHelper.GetChild(dependencyObject, num);
                        T t = child as T;
                        if (t != null)
                        {
                            return t;
                        }
                        queue.Enqueue(child);
                        num--;
                    }
                }
                return default(T);
            }
            public static T FindChildOfType<T>(DependencyObject root) where T : class
            {
                Queue<DependencyObject> queue = new Queue<DependencyObject>();
                queue.Enqueue(root);
                while (queue.Count > 0)
                {
                    DependencyObject dependencyObject = queue.Dequeue();
                    int num = VisualTreeHelper.GetChildrenCount(dependencyObject) - 1;
                    while (0 <= num)
                    {
                        DependencyObject child = VisualTreeHelper.GetChild(dependencyObject, num);
                        T t = child as T;
                        if (t != null)
                        {
                            return t;
                        }
                        queue.Enqueue(child);
                        num--;
                    }
                }
                return default(T);
            }

    在ListBox控件的Loaded方法中添加如下代码

          private void AddHandler()
            {
                this.m_scrollViewer = CommonUtil.FindChildOfType<ScrollViewer>(this.lstList);
                if (this.m_scrollViewer != null)
                {
                    this.m_scrollBar = CommonUtil.FindChildOfType<ScrollBar>(this.m_scrollViewer);
                    if (this.m_scrollBar != null)
                    {
                        m_scrollBar.ValueChanged += bar_ValueChanged;
                        m_scrollBar.SizeChanged += bar_SizeChanged;
                    }
                }
            }
            void lstList_Loaded(object sender, RoutedEventArgs e)
            {
                AddHandler();
            }

    当滚动条到达底部的时候就会执行 MainPageVM.LoadNextData();方法...这个方法可以改成你想要的。

      void bar_SizeChanged(object sender, SizeChangedEventArgs e)
            {
    
            }
    
            void bar_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
            {
                ScrollBar bar = (ScrollBar)sender;
                object obj2 = bar.GetValue(RangeBase.ValueProperty);
                object obj3 = bar.GetValue(RangeBase.MaximumProperty);
                if ((obj2 != null) && (obj3 != null))
                {
                    double num = (double)obj2;
                    double num2 = ((double)obj3) - 2.0;
                    if (num >= num2)
                    {
                        this.LoadingMore.Visibility = Visibility.Visible;
                        this.LoadingMoreRing.IsActive = true;
                        var MainPageVM = base.DataContext as MainPageViewModel;
                        MainPageVM.LoadNextData();
                    }
                }
            }

    第一种方法很简单明了...不需要用任何控件就能实现了!

    -----------------------------------------------------------------------

    二、

    第二种则是用控件来实现的..首先你要下载DanielVaughan.ScrollViewerMonitor.rar,这是国外程序员封装好的一个控件

    使用方法更加简单,如下所示:

    <ListBox ItemsSource="{Binding Items}"         u:ScrollViewerMonitor.AtEndCommand="{Binding FetchMoreDataCommand}" />

    注意的这里的AtEndCommand是一个附加属性,当用户滚动到列表末尾后,就会执行指定的命令。

    总结,这里说的两种方法是我比较常用到的...分享给大家..有什么建议或者意见欢迎留言讨论!

  • 相关阅读:
    浅谈if __name__='__main__'
    python打开文件方式
    关于ValueError: not enough values to unpack (expected 4, got 1)
    一篇文章让你搞懂this
    Cannot read property 'addEventListener' of null报错的解决办法
    看JS操作符中二进制补码
    js的原型和原型链理解
    你不知道的js中对象,数组互相转换
    浅谈js中a+++a与a+a++值区别
    Integer跟int的区别
  • 原文地址:https://www.cnblogs.com/cracker/p/WindowsPhone_AtEndCommand.html
Copyright © 2011-2022 走看看