2015-12-25 4 views
0

У меня есть ListView (native) с динамическим контентом, и я хочу знать, как определить, когда пользователь его прокручивает, но не стиль «isScrolling = true/false ", вместо этого я хочу знать, когда пользователь прокручивает его, и когда пользователь прокручивает его.Как обнаружить, когда ListView уходит, и когда он идет вверх

Я попробовал этот трюк: https://stackoverflow.com/a/27294644/4668642 Но проблема в том, что он возвращает только «истина/ложь» (на самом деле это стреляет Sub) и заливает Sub тоже (я имею в виду, я прокрутить ListView очень жесткий и Sub срабатывает несколько раз, поэтому действие, которое он прослушивает).

Я не знаю, существует ли родной путь (как событие, такое как ManipulationDelta [это не работает]) или другой трюк, подобный этому сообщению.

Это мой код сейчас:

'On a shared file' 
Public Shared Function GetScrollViewer(depObj As DependencyObject) As ScrollViewer 
    If TypeOf depObj Is ScrollViewer Then 
     Return TryCast(depObj, ScrollViewer) 
    End If 

    For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(depObj) - 1 
     Dim child = VisualTreeHelper.GetChild(depObj, i) 

     Dim result = GetScrollViewer(child) 
     If result IsNot Nothing Then 
      Return result 
     End If 
    Next 
    Return Nothing 
End Function 

'on OnNavigatedTo event' 
AddHandler GetScrollViewer(LVNot).ViewChanged, AddressOf LVNot_ViewChanged 

'At the end of the Main.xaml.vb file' 
Private Sub LVNot_ViewChanged() 
    If Cab.isUp = True Then 
     Cab.goDownSub() 
    End If 
End Sub 

Note1: "Кабина" является "Пользовательские AppBar управления" (UserControl), ISUP это логическая переменная, которая возвращает истину, когда Cab вверх (видимое), и False, когда он выключен (Скрыть), и goDownSub() - это Sub, который скрывает «Кабина»

Примечание2: Этот код выполнен с использованием VB (VisualBasic), но я также работаю с C#. У меня нет проблем с answerd, сделанным с C# вместо VB.

ответ

0

Okey, я нашел способ получить позицию listview.

Код последующей экстрагировали из 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; 
} 

Тогда можно детерминированным, в каком направлении был ListView прокрутки:

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

Хмм, причина, по которой listview сама содержит встроенный просмотрщик прокрутки, вы не можете поместить этот элемент управления в другое средство просмотра прокрутки и легко получить смещение прокрутки, мое предложение - использовать панель стека в ScrollViwer и следить за изменениями в случае ViewChanged scrollViwer и получить в настоящее время смещение по методу VerticalOffset().

Смежные вопросы