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

时间:2015-02-18 15:21:46

标签: c# wpf user-interface scroll

如何在WPF中检测用户发起的滚动事件?用户发起的滚动是指由鼠标点击滚动条或用户使用滚动条的上下文菜单引起的滚动事件像截图一样吧。

enter image description here

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

1 个答案:

答案 0 :(得分:2)

正如 Sinatr 建议的那样,我创建了一个标记,记住是否已触发ScrollIntoView。这个解决方案似乎工作正常,但需要处理ScrollChangedEventArgs

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

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;
}