在 WPF 中检测用户发起的滚动

Detect user originated scroll in WPF

如何在 WPF 中检测到用户发起的滚动事件?用户发起的滚动是指由 鼠标 单击 滚动条 或用户使用 上下文引起的滚动事件屏幕截图中滚动条的菜单

我想知道的原因是:当用户想要手动控制滚动位置时,我想停用我已经实现的自动滚动功能。通过调用 ScrollIntoView 自动向下滚动到新添加的元素的 ListView,应该在用户进行任何手动滚动时停止此行为。

正如 Sinatr 所建议的那样,我创建了一个标志来记住 ScrollIntoView 是否已被触发。这个解决方案似乎工作得很好,但需要对 ScrollChangedEventArgs

进行一些处理

相关位在scrollViewer_ScrollChanged中,但我为上下文提供了更多代码,当用户试图向上滚动时自动滚动被停用,当他滚动到底部时重新激活。

private volatile bool isUserScroll = true;
public bool IsAutoScrollEnabled { get; set; }

// Items is the collection with the items displayed in the ListView

private void DoAutoscroll(object sender, EventArgs e)
{
    if(!IsAutoScrollEnabled)
        return;
    var lastItem = Items.LastOrDefault();
    if (lastItem != null)
    {
        isUserScroll = false;
        logView.ScrollIntoView(lastItem);
    }
}

private void scrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
    if (e.VerticalChange == 0.0)
        return;

    if (isUserScroll)
    {
        if (e.VerticalChange > 0.0)
        {
            double scrollerOffset = e.VerticalOffset + e.ViewportHeight;
            if (Math.Abs(scrollerOffset - e.ExtentHeight) < 5.0)
            {
                // The user has tried to move the scroll to the bottom, activate autoscroll.
                IsAutoScrollEnabled = true;
            }
        }
        else
        {
            // The user has moved the scroll up, deactivate autoscroll.
            IsAutoScrollEnabled = false;
        }
    }
    isUserScroll = true;
}