LIST BOX 真心有点蛋疼。。。 滚来滚去 你就是不知掉 他滚在那里 。。。 对于 在移动 设备上经常需要使用 列表 并且 滚动加载 这可蛋疼 。
编辑过 Listbox 的template 人肯定知道 ListBox 里面的主体是个ScrollView构成的 ,我们来看看 这个 ScrollView 。。。
唔。。。 里面 额 。。 有两个东西
VerticalOffset
HorizontalOffset
这两个分别可以获取 垂直和水平方向上的滚动位置 。。。
(其实 ScrollView 里面是有两个 ScrollBar ScrollBar有Value Change 事件 ,可以挖出 ScrollBar 找到 事件 并订阅的,, 。。。。)
现在我们第一定出我们的策略 就是 挖出 ScrollView 然后 监听 VerticalOffset 当 VeritcalOffset 到最大值的时候 就可以发出一个滚动到底部的通知?! 事件?! 无所谓了。。。
好吧 直接上代码
代码如下 | 复制代码 |
public class ScrollBehavior { public static DependencyProperty AtEndCommandProperty = DependencyProperty.RegisterAttached( "AtEndCommand", typeof(ICommand), typeof(ScrollBehavior), new PropertyMetadata(null, OnCommandChanged)); public static ICommand GetAtEndCommand(DependencyObject obj) public static void SetAtEndCommand(DependencyObject obj, ICommand value) public static DependencyProperty AtTopCommandProperty public static ICommand GetAtTopCommand(DependencyObject obj) public static void SetAtTopCommand(DependencyObject obj, ICommand value) public static DependencyProperty AtScrollCommandProperty public static ICommand GetAtScrollCommand(DependencyObject obj) public static void SetAtScrollCommand(DependencyObject obj, ICommand value)
public static void OnCommandChanged( static void element_Loaded(object sender, RoutedEventArgs e) var listener = new Listener(); if (scrollViewer.ScrollableHeight != 0) CommandArg endCommandArg = new CommandArg(); var endCommand = GetAtEndCommand((FrameworkElement)sender); if (endCommand != null && endCommand.CanExecute(endCommandArg)) //System.Diagnostics.Debug.WriteLine(scrollViewer.VerticalOffset.ToString()); var topCommand = GetAtTopCommand((FrameworkElement)sender); //System.Diagnostics.Debug.WriteLine("Scroll Top"); CommandArg scrollCommandArg = new CommandArg(); var scrollCommand = GetAtScrollCommand((FrameworkElement)sender); }; Binding binding = new Binding("VerticalOffset"); } } static T FindChildOfType<T>(DependencyObject root) where T : class while (queue.Count > 0) public class Listener public Listener() public event EventHandler<ValueChangedEventArgs> Changed; void HandleValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) OnChanged(new ValueChangedEventArgs(e)); protected void OnChanged(ValueChangedEventArgs e) if (Changed != null) public void Attach(ScrollViewer element, Binding binding) target = element; } public void Detach() } public class ValueChangedEventArgs : EventArgs public DependencyPropertyChangedEventArgs EventArgs { get; private set; } |
我先做了三个ICommand 类型的动态 属性 分别是 滚动到顶部 底部 和滚动中 所调用的Command
然后在动态属性绑定时 订阅控件 Loaded事件 ,这样 空间一旦Loaded 就我们就去翻出ScrollView 然后的 Listener 去监听 他的 VerticalOffset
监听器 其实就是做了个动态属性的Listener ,我们只需要把 ScrollView.VerticalOffset 绑定到 这个 Listener 的动态属性上 ,这样当值一旦变化 就会调用 方法HandleValueChanged