近期项目中遇到载入数据的性能问题, 原因是.net4.0的虚拟化支持不够完毕,有好多bug在4.5才修复。 我们仅仅能利用大家通用的做法来延迟载入数据:
每次载入固定少量的数据。当拖动究竟后。继续载入兴许同样数量的数据。
思路:
监听ScrollViewer的VerticalOffsetProperty,假设值达到同意滚动的高度ScrollableHeight,则发出event通知外部处理载入逻辑。
用法:
1.对于ItemsControl编辑控件模板,在当中的ScrollViewer中增加behavior。
<ScrollViewer x :Name="DG_ScrollViewer" Focusable="false">
                                                                                                                                 <i: Interaction.Behaviors>
                                                                                                                                                 <local: ReachingBottomBehavior ReachingBottomEvent="LazyLoadingBehavior_OnReachingBottomEvent" />
                                                                                                                                 </i: Interaction.Behaviors>
在blend中,比較简单。直接对控件右键。编辑模板/副本。进入ScrollViewer后,把这个behavior拖到ScrollViewer的元素下就可以, 生成的代码就是上面的内容。
xmlns:i ="http://schemas.microsoft.com/expression/2010/interactivity"
2.实现上面ReachingBottomEvent的处理逻辑。比方:
  private void LazyLoadingBehavior_OnReachingBottomEvent ()
        {
            var vm = LayoutRoot. DataContext as MainViewModel;
            if (vm != null)
            {
                int count = dtgRoot. Items .Count ;
                for (int i = count ; i < count + 30; i ++)
                {
                    vm .DataItems . Add(
                                     new DataItem ()
                                     {
                                         Item1 = i . ToString(),
                                         Item2 = i . ToString() + i .ToString ()
                                     });
                }
            }
        }
代码例如以下:
 public class ReachingBottomBehavior : Behavior< ScrollViewer>
    {
        public ReachingBottomBehavior ()
        {
            // Insert code required on object creation below this point.
        }
        protected override void OnAttached()
        {
            base.OnAttached ();
            // Insert code that you would want run when the Behavior is attached to an object.
            var dpd = DependencyPropertyDescriptor. FromProperty(ScrollViewer .VerticalOffsetProperty, AssociatedType);
            dpd.AddValueChanged (
                                AssociatedObject,
                                (sender,
                                 args) =>
                                {
                                    RaiseReachingBottomEvent();
                                });
        }
        protected override void OnDetaching()
        {
            base.OnDetaching ();
            // Insert code that you would want run when the Behavior is removed from an object.
        }
        private void RaiseReachingBottomEvent()
        {
            bool isReachingBottom = AssociatedObject. VerticalOffset >= AssociatedObject .ScrollableHeight;
            if (isReachingBottom )
            {
                if (this .ReachingBottomEvent != null)
                {
                    this.ReachingBottomEvent ();
                }
            }
        }
        public event Action ReachingBottomEvent;
    }

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

ScrollViewer滚动究竟来触发载入数据的Behavior的更多相关文章

  1. [JS前端开发] js/jquery控制页面动态载入数据 滑动滚动栏自己主动载入事件

    本人小菜鸟一仅仅.为了自我学习和交流PHP(jquery,linux,lamp,shell,javascript,server)等一系列的知识,小菜鸟创建了一个群.希望光临本博客的人能够进来交流.寻求 ...

  2. (七十一)关于UITableView退出崩溃的问题和滚动究竟部的方法

    [TableView退出崩溃的问题] 近期在使用TableView时偶然发如今TableView中数据较多时,假设在滚动过程中退出TableView到上一界面.会引起程序的崩溃.经过网上查阅和思考我发 ...

  3. android异步任务载入数据界面实现

    android 异步任务的一个后台方法本质是开启一个线程完毕耗时操作,其它onPostExecute方法和onPreExecute方法执行在UI主线程用于更新UI界面.为了提高用户体验常见的异步任务载 ...

  4. QlikView实现部分载入数据的功能(Partial Load)

    问题背景: 一直非常想不通,公司花了N多钱请了一帮QlikView的Consultant做出来的solution居然没有涉及Reload的部分,以至于每次刷新数据都须要刷新整个Data Model,之 ...

  5. 自定义ScrollViewer的Touch事件--触摸上下移动ScrollViewer滚动到指定位置

    double mPointY;//触摸点的Y坐标 double mOffsetY;//滚动条当前位置 bool mIsTouch = false;//是否触摸 //触摸事件 private void ...

  6. android中listview分页载入数据

    前段时间做的新浪微博项目一直想实现listview分页载入数据,今天最终实现了,哈哈!感觉挺好的,今天又写了个demo给大家分享下. 首先说下listview的优化方案,这也是面试中常考的题目.优化方 ...

  7. Android中系统设置中的清除数据究竟会清除哪些数据

    今天中的一个story突然提到了系统设置中的清理数据,后来开始思考究竟系统的应用的这个清理功能,究竟会清理那些数据. 于是开始研究,以com.mx.browser为例,思路大概为首先为/data/da ...

  8. ExtJS学习笔记2:响应事件、使用AJAX载入数据

    响应事件: 1.设置一个html标记 <div id="my-div">Ext JS 4 Cookbook</div> 2.使用get函数获取此标记对象 v ...

  9. Spring Boot 启动载入数据 CommandLineRunner

    实际应用中,我们会有在项目服务启动的时候就去载入一些数据或做一些事情这种需求. 为了解决这种问题.Spring Boot 为我们提供了一个方法.通过实现接口 CommandLineRunner 来实现 ...

随机推荐

  1. 图方法:寻找无向图联通子集的JAVA版本

    图像处理中一般使用稠密方法,即对图像进行像素集合进行处理.在图像拓扑方面,更多地应用图计算方法. 寻找无向图联通子集的JAVA版本,代码: //查找无向图的所有连通子集//wishchin!!! pu ...

  2. <转>c++引用与指针的区别(着重理解)

     ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名.  ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指 ...

  3. BZOJ 4698: Sdoi2008 Sandy的卡片 后缀数组 + RMQ + 查分

    题目描述 Sandy和Sue的热衷于收集干脆面中的卡片. 然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型. 每一张卡片都由一些数字进行标记,第i张卡片的 ...

  4. BZOJ 1572: [Usaco2009 Open]工作安排Job 贪心 + 堆 + 反悔

    Description Farmer John想修理牧场栅栏的某些小段.为此,他需要N(1<=N<=20,000)块特定长度的木板,第i块木板的长度为Li(1<=Li<=50, ...

  5. ADB 常用命令学习

    参考文档:https://www.cnblogs.com/bravesnail/articles/5850335.html非常感谢作者的分享,以下是我学习的记录.Android 常用adb 命令汇总- ...

  6. S-HR二开基础

    检测是否某个类部署上去了:http://10.3.0.115:6888/easportal/tools/getclassurl.jsp?className=com.kingdee.eas.hr.ser ...

  7. 移动端调试 vConsole

    <head> <script src="path/to/vconsole.min.js"></script> <script> va ...

  8. 算法工程师首先是工程师系列01 - 服务器篇 - 物理服务器安装centos7

    尤其在互联网公司中,如果不是分工特别明确的独立业务组,通常需要自己处理很多东西,例如一个算法工程师,虽然不要求你装机,但是和负责部署服务的同事对接口,总不能连json是啥都不知道(工作中遇到过一个ET ...

  9. 07.网络编程-4.HTTP

    HTTP是一种无状态的协议,无状态是指Web浏览器和Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应(response),连接就被关闭了,在服务器 ...

  10. 2、在1.VMware虚拟机上安装ubantu系统

    1.新建新的虚拟机系统 2.使用自定义高级安装 3.选择下一步操作 4.选择稍后安装 4.因为我们要安装的是Linux的发行版本ubuntu,所以这里选择Linux(L),版本是Ubuntu 64位, ...