ScrollViewer滚动究竟来触发载入数据的Behavior

近期项目中遇到载入数据的性能问题, 原因是.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;

}

时间: 2024-11-03 21:04:14

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

ScrollViewer滚动到底来触发加载数据的Behavior

最近项目中遇到加载数据的性能问题, 原因是.net4.0的虚拟化支持不够完成,有好多bug在4.5才修复. 我们只能利用大家通用的做法来延迟加载数据: 每次加载固定少量的数据,当拖动到底后,继续加载后续相同数量的数据. 思路: 监听ScrollViewer的VerticalOffsetProperty,如果值达到允许滚动的高度ScrollableHeight,则发出event通知外部处理加载逻辑. 使用方法: 1.对于ItemsControl编辑控件模板,在其中的ScrollViewer中加入b

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

[TableView退出崩溃的问题] 近期在使用TableView时偶然发如今TableView中数据较多时,假设在滚动过程中退出TableView到上一界面.会引起程序的崩溃.经过网上查阅和思考我发现这样的情况出如今一个UIView控制器拥有一个TableView,TableView无法在UIView销毁前全然销毁,从而继续调用dataSource,而这时候UIView已经不可用了,会引发野指针错误. 避免方法非常easy,仅仅须要在UIView的dealloc方法中把dataSource设为

asp.net网站开发中用jquery实现滚动浏览器滚动条加载数据(类似于腾讯微博)

自从腾讯微博上线以来,基本上就开始用了,一直到现在,作为一个开发人员,也看到了腾讯微博一直在不停的改变,也不知道大家有没有发现,腾讯微博提供两种加载数据的方式,一种是分页,一种是滚动浏览器滚动条加载数据,分页功能我想大家都做得太多了,今天我与大家分享一下我用滚动条滚动加载数据,小生不才,还望各位大侠指教,呵呵~ 下面开讲: 首先说一下思路,我用的是Jquery,然后通过Jquery的ajax()方法通过 HTTP 请求加载远程数据来实现的,用到Jquery,首先要应用jquery.min.js类

android listView 滑动载入数据 该数据是服务端获取的

package com.sunway.works.applycash; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import com.sunway.works.R; import com.sunway.works.applycash.ApplyCashListActivity; impo

android中listview分页载入数据

前段时间做的新浪微博项目一直想实现listview分页载入数据,今天最终实现了,哈哈!感觉挺好的,今天又写了个demo给大家分享下. 首先说下listview的优化方案,这也是面试中常考的题目.优化方案有三种:1,假设自己定义适配器,那么在getView方法中推断contentView是否为空,假设为空创建contentView并返回,假设不为空直接返回contentView.这样能尽可能少创建view.2.给contentView设置tag,传入一个viewHoder对象,用于缓存要实现的数据

解决移动端页面滚动后不触发touchend事件

解决移动端页面滚动后不触发touchend事件 问题 在移动端页面进行优化时,一般使用touch事件替代鼠标相关事件.用的较多的是使用touchend事件替代PC端的click和mouseup事件. 可是,touchend事件在页面滚动时有个问题.在滚动完毕后,假设当前触点的位置所指的元素绑定了touchend事件,这时便会触发该元素的touchend事件,造成误操作. 解决方法 解决方法非常easy.就是在页面滚动时停止touchend事件冒泡.这样就能够防止触发touchend事件. 用法

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

问题背景: 一直非常想不通,公司花了N多钱请了一帮QlikView的Consultant做出来的solution居然没有涉及Reload的部分,以至于每次刷新数据都须要刷新整个Data Model,之前和部门同事讨论的时候我还信誓旦旦的说QlikView就仅仅能这样了,找不到方法仅仅将新数据刷新到Data Model中而不用又一次load之前已经在Memory里面的数据. 幸而今天一位朋友提到了Add Load中的Partial Load,于是便查了一个小时的Google,经过回来试验之后,豁然

WPF: 实现 ScrollViewer 滚动到指定控件处

原文:WPF: 实现 ScrollViewer 滚动到指定控件处 在前端 UI 开发中,有时,我们会遇到这样的需求:在一个 ScrollViewer 中有很多内容,而我们需要实现在执行某个操作后能够定位到其中指定的控件处:这很像在 HTML 页面中点击一个链接后定位到当前网页上的某个 anchor. 要实现它,首先我们需要看 ScrollViewer 为我们提供的 API,其中并没有类似于 ScrollToControl 这样的方法:在它的几个以 ScrollTo 开头的方法中,最合适的就是 S

滚动条滚动到底部触发事件

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><h