6

有没有办法检测ScrollViwerListView处于滚动模式并停止滚动。在Windows Phone 8.1 ListView中,我们无法获得scrollviewer的参考。如何检测ListView向上或向下滚动

任何人在Windows Phone 8.1 WinRT应用程序中完成它?

+1

正如我想的,你应该接受@yasen的回答 - 他更快(3秒),编辑后有更好的方法遍历* VisualTree *;) – Romasz 2014-12-07 09:11:10

+0

感谢提及。我已经改变了接受的答案,再次感谢:) – 2014-12-07 09:53:12

+1

@Romasz谢谢。一如既往,您的答案也很好。 :)只有少一点通用。 – yasen 2014-12-08 09:40:21

回答

6

一旦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(); 
4

您可以找到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; 
+0

我正在使用IsupportIncrementalLoading扩展类来填充列表视图,其中项目从Internet加载。在这种情况下,我如何获得scrollviewer,因为listview需要一些时间来填充子项。 – MohanRajNK 2015-02-01 12:20:22

+0

@MohanRajNK问题在哪里 - 你想达到什么目的?正如我认为ListView有一个滚动查看器和增量加载只是在需要时加载项目。 – Romasz 2015-02-01 13:24:48

+0

问题是我怎样才能得到一个scrollviewer?我在listview加载的方法中调用了getscrollviewer方法。但在那个时候,listview没有子项目。即GetChildrenCount返回0. – MohanRajNK 2015-02-01 13:55:34

-1

必须加载数据获取滚动视图前的ListView。如果listview有空行,那么你得到的scrollview将为空。

相关问题