ScrollViewer滚动到底来触发加载数据的Behavior
来源:互联网 发布:浙江2017年专升本数据 编辑:程序博客网 时间:2024/06/05 06:23
最近项目中遇到加载数据的性能问题, 原因是.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;
}
1 0
- ScrollViewer滚动到底来触发加载数据的Behavior
- ScrollViewer的滚动问题
- AngularJS:实现页面滚动到底自动加载数据的功能
- Scrollviewer 无法滚动 的原因
- JavaScript滚动到底部触发加载数据
- 滚动条到底自动加载数据
- UWP 将ScrollViewer滚动到ScrollViewer中的控件的位置
- WPF的ScrollViewer鼠标的滚动
- WPF scrollviewer 无法滚动的原因
- 【WPF】ScrollViewer无法滚动的问题
- 让 ScrollViewer 的滚动带上动画
- 滚动到底加载
- 滚动到底加载
- ScrollViewer的滚动问题(ScrollViewer里添加stackPanel,再加俩个listbox无法滚动的问题)
- Android之ListView滚动到底后自动加载数据
- Android之ListView滚动到底后自动加载数据
- Android之ListView滚动到底后自动加载数据
- Android之ListView滚动到底后自动加载数据
- xcode快捷键
- IOS获取网络图片的尺寸
- Bean named must be of type , but was actually of type
- 错误1error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead.
- makefile函数
- ScrollViewer滚动到底来触发加载数据的Behavior
- 自定义EditText形状 和自定义Checkbox
- 黑马程序员——IO流篇
- IOS实现高斯模糊
- leetcode: Summary Ranges
- 一张图看尽 Linux 内核运行原理
- IOS实现背景色渐变
- JQuery用户登录时的检测
- javascript js undefined null 0 false void(0) NaN 空字符串 比较 区别