滚动条滑到底完美解决方案(适合任何带滚动条或ScrollBar控件 (五)

2014-11-24 02:32:53 · 作者: · 浏览: 12
VerticalOffset");

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]












有些控件中没有ScrollViewer控件,但是有ScrollBar控件,我这里提供一个ScrollBarTrigger,原理与ScrollViewerTrigger稍有不同,哪里不同自己研究。另外ScrollBarTrigger比ScrollViewerTrigger更具通用性,因为ScrollViewer中包含ScrollBar。
下面是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)
{