在 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;
}
如何在 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;
}