0

我尝试在 UAP 中使用新的 Behavior-Feature。我使用这种行为:

public sealed class AutoScrollToLastItemBehavior : Behavior<ListView>
{
    private bool _collectionChangedSubscribed;

    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.SelectionChanged += SelectionChanged;
        AssociatedObject.DataContextChanged += DataContextChanged;
    }

    private void SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ScrollToBottom();
    }

    private void CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        ScrollToBottom();
    }

    private void DataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args)
    {
        var collection = AssociatedObject.ItemsSource as INotifyCollectionChanged;
        if (collection == null || _collectionChangedSubscribed) return;

        collection.CollectionChanged += CollectionChanged;
        _collectionChangedSubscribed = true;
    }

    private void ScrollToBottom()
    {
        var selectedIndex = AssociatedObject.Items?.Count - 1;

        if (!selectedIndex.HasValue || selectedIndex < 0)
            return;

        AssociatedObject.SelectedIndex = selectedIndex.Value;
        AssociatedObject.UpdateLayout();
        AssociatedObject.ScrollIntoView(AssociatedObject.SelectedItem);
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.SelectionChanged -= SelectionChanged;
        AssociatedObject.DataContextChanged -= DataContextChanged;

        var collection = AssociatedObject.ItemsSource as  INotifyCollectionChanged;
        if (collection == null || !_collectionChangedSubscribed) return;
        collection.CollectionChanged -= CollectionChanged;
        _collectionChangedSubscribed = false;
    }
}

这段代码运行良好。但我希望当用户与 ListView 交互时自动滚动停止。我找到了一些示例,但其中大多数基于 WPF,并且某些功能或属性在 UWP 中不存在。

所以实际上我没有找到一种方法来实现一个自动滚动,如果用户自己滚动它就会停止工作。有人可能对此有想法吗?

问候

4

1 回答 1

0

这实际上取决于您所说的“用户与 a 交互”是什么意思ListView。如果您的意思是有人手动滚动 - 您可以检查ViewChanged事件或VerticalOffsetScrollViewer集合更改之前查看它是否滚动到底部。其他交互可能是您的应用程序自定义的事情,因此您必须自己检测它们。在查看这些详细信息之前,您需要ScrollViewer先从模板访问。ListView

于 2016-03-28T23:57:35.973 回答