如何检测ListView向上或向下滚动
有没有办法检测ScrollViwer
的ListView
处于滚动模式并停止滚动。在Windows Phone 8.1 ListView
中,我们无法获得scrollviewer的参考。如何检测ListView向上或向下滚动
任何人在Windows Phone 8.1 WinRT应用程序中完成它?
一旦ListView控件是Loaded
你可以得到ScrollViewer
这样的:
var sv = (ScrollViewer)VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(this.ListV, 0), 0);
编辑
由于Romasz建议,一旦你的ScrollViewer
,你可以使用它ViewChanged
事件,监控当它滚动和停止时。
而且,这里就是我使用遍历可视树的通用扩展方法:
// The method traverses the visual tree lazily, layer by layer
// and returns the objects of the desired type
public static IEnumerable<T> GetChildrenOfType<T>(this DependencyObject start) where T : class
{
var queue = new Queue<DependencyObject>();
queue.Enqueue(start);
while (queue.Count > 0) {
var item = queue.Dequeue();
var realItem = item as T;
if (realItem != null) {
yield return realItem;
}
int count = VisualTreeHelper.GetChildrenCount(item);
for (int i = 0; i < count; i++) {
queue.Enqueue(VisualTreeHelper.GetChild(item, i));
}
}
}
要使用此methos得到ScrollViewer
,这样做:
var sv = yourListView.GetChildrenOfType<ScrollViewer>().First();
您可以找到ScrollViewer您的ListView使用VisualTreeHelper。例如像这样:
// method to pull out a ScrollViewer
public static ScrollViewer GetScrollViewer(DependencyObject depObj)
{
if (depObj is ScrollViewer) return depObj as ScrollViewer;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
var child = VisualTreeHelper.GetChild(depObj, i);
var result = GetScrollViewer(child);
if (result != null) return result;
}
return null;
}
一旦你有一个的ScrollViewer您可以订阅其事件:
GetScrollViewer(yourListView).ViewChanged += yourEvent_ViewChanged;
我正在使用IsupportIncrementalLoading扩展类来填充列表视图,其中项目从Internet加载。在这种情况下,我如何获得scrollviewer,因为listview需要一些时间来填充子项。 – MohanRajNK 2015-02-01 12:20:22
@MohanRajNK问题在哪里 - 你想达到什么目的?正如我认为ListView有一个滚动查看器和增量加载只是在需要时加载项目。 – Romasz 2015-02-01 13:24:48
问题是我怎样才能得到一个scrollviewer?我在listview加载的方法中调用了getscrollviewer方法。但在那个时候,listview没有子项目。即GetChildrenCount返回0. – MohanRajNK 2015-02-01 13:55:34
必须加载数据获取滚动视图前的ListView。如果listview有空行,那么你得到的scrollview将为空。
正如我想的,你应该接受@yasen的回答 - 他更快(3秒),编辑后有更好的方法遍历* VisualTree *;) – Romasz 2014-12-07 09:11:10
感谢提及。我已经改变了接受的答案,再次感谢:) – 2014-12-07 09:53:12
@Romasz谢谢。一如既往,您的答案也很好。 :)只有少一点通用。 – yasen 2014-12-08 09:40:21