BindingOperations.SetBinding(this, ScrollViewerTrigger.VerticalOffsetProperty, binding);
} 还记得我之前提到的VerticalOffset属性吗,我通过绑定将ScrollViewer中的VerticalOffset属性与这个Trigger中的VerticalOffset绑定在一起,这样ScrollViewer种的VerticalOffset一旦有变化我这边可以实时指导。ScrollViewer中是没有VerticalOffset变化通知的事件的,但通过绑定则可以解决这个问题。若做横向监控功能, binding.Path = new PropertyPath("VerticalOffset");换成binding.Path = new PropertyPath("HorizontalOffset");就可以了。
关键一步解决了剩下的就好办了,VerticalOffset一旦有变化则会调用到VerticalOffsetPropertyChanged函数,然后再调用OnVerticalOffsetChanged对坐标进行处理。
OnVerticalOffsetChanged中会对滚动条的当前位置进行筛选,若滚动条滑倒了底部就会触发Trigger自带的Actions,我这里提供一个事件ScrollTrigger,在达到底部时也会触发,方便外部使用。
使用起来很简单,假如我们的viewmodel中有一个加载更多数据的命令,使用如下
[html]
下面是ScrollBarTrigger代码:
[csharp]
public enum DirectionType { Top, Bottom, Left, Right }
public class ScrollBarTrigger : TriggerBase
{
ScrollBar ScrollView;
public static readonly DependencyProperty DirectionTypeProperty = DependencyProperty.Register("DirectionType", typeof(DirectionType), typeof(ScrollBarTrigger), new PropertyMetadata(DirectionType.Bottom));
public DirectionType DirectionType
{
get
{
return (DirectionType)base.GetValue(ScrollBarTrigger.DirectionTypeProperty);
}
set
{
base.SetValue(ScrollBarTrigger.DirectionTypeProperty, value);
}
}
public event EventHandler ScrollTrigger;
protected override void OnAttached()
{
base.OnAttached();
if (this.AssociatedObject != null && this.AssociatedObject is FrameworkElement)
{
(this.AssociatedObject as FrameworkElement).SizeChanged += control_SizeChanged;
}
}
protected override void OnDetaching()
{
base.OnDetaching();
if (ScrollView != null)
ScrollView.ValueChanged -= ScrollView_ValueChanged;
if (this.AssociatedObject != null && this.AssociatedObject is FrameworkElement)
{
(this.AssociatedObject as FrameworkElement).SizeChanged -= control_SizeChanged;
}
}
void control_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (this.AssociatedObject == null || !(this.AssociatedObject is FrameworkElement))
return;
ScrollBar Scroll = this.AssociatedObject.GetFirstDescendantOfType
if (Scroll != null)
{
AttachedScroll(Scroll);
(this.AssociatedObject as FrameworkElement).SizeChanged -= control_SizeChanged;
}
}
void AttachedScroll(ScrollBar Scroll)
{