我有一个带有动态内容的ListView(本机),我想知道如何检测用户何时滚动它,但不知道“isScrolling = true / false”的样式,而是我想知道用户何时滚动它当用户将其向下滚动时。
我试过这个伎俩:https://stackoverflow.com/a/27294644/4668642 但问题是它只返回“真/假”(实际上它会触发一个Sub)并且它也泛滥Sub(我的意思是,我非常努力地滚动ListView并且Sub被多次触发,所以它的动作是窃听)。
我不知道是否存在Native方式(就像ManipulationDelta [它不起作用]这样的事件)或者像该帖子那样的其他技巧。
这是我现在的代码:
"YourApplicationFileName.exe"=dword:00002af9`
"YourApplicationFileName.vshost.exe"=dword:00002af9`
注1:“Cab”是“自定义AppBar控件”(UserControl),isUp是一个布尔值,当Cab启动(可见)时返回True,当它关闭时隐藏(隐藏),goDownSub()是Sub隐藏“出租车”
注2:此代码是用VB(VisualBasic)编写的,但我也使用C#。使用C#而不是VB来回答我没有任何问题。
答案 0 :(得分:0)
嗯,因为listview本身包含一个内置的滚动查看器,你无法将此控件放在另一个滚动查看器中并轻松获得滚动偏移,我的建议是在ScrollViwer中使用堆栈面板并监视ViewChanged事件中的更改of scrollViwer并通过VerticalOffset()方法获取当前偏移量。
答案 1 :(得分:0)
以下代码摘自https://stackoverflow.com/a/4954586/4668642
var scrollViewer = FindScrollViewer(listBox);
var offset = scrollViewer.VerticalOffset;
static ScrollViewer FindScrollViewer(DependencyObject parent)
{
var childCount = VisualTreeHelper.GetChildrenCount(parent);
for (var i = 0; i < childCount; i++)
{
var elt = VisualTreeHelper.GetChild(parent, i);
if (elt is ScrollViewer) return (ScrollViewer)elt;
var result = FindScrollViewer(elt);
if (result != null) return result;
}
return null;
}
然后可以确定列表视图滚动到哪个方向:
Double offSetNew, offSetOld
private void LVNot_ViewChanged()
{
dynamic ScrollViewer = FindScrollViewer(LVNot);
offSetNew = ScrollViewer.VerticalOffset;
if (offSetOld != 0) { //To avoid (offSetOld > offSetNew) being fired in the first instance
if (offSetOld > offSetNew) {
//Go Up
} else if (offSetOld < offSetNew) {
//Go Down
}
}
offSetOld = offSetNew;
}