【问题标题】:ListView Behavior for AutoScrolling that stops at user interaction在用户交互时停止的自动滚动的 ListView 行为
【发布时间】:2016-03-11 11:59:18
【问题描述】:

我尝试在 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 中不存在。

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

问候

【问题讨论】:

  • 你说“自动滚动”是什么意思?
  • 想想聊天工具。一条新消息进来,聊天滚动到最后(这就是我对 AutoScroll 的意思,它自动滚动到插入的最后一个项目)。但是现在用户想在聊天底部阅读一条消息,而自动滚动会破坏他的计划。这就是我的实际问题^^

标签: c# listview win-universal-app uwp-xaml


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-10-13
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 2014-07-14
    • 2012-07-22
    • 1970-01-01
    相关资源
    最近更新 更多