2014-09-17 2 views
2

У меня есть приложение чата, которое показывает сообщения в LongListSelector и добавляет новые с оператором ObservableCollection.Insert(0, message).Прокрутить LongListSelector при добавлении нового элемента

Проблема заключается в том, что при добавлении нового сообщения LongListSelector не прокручивается до нового сообщения.

Лучшим решением, на мой взгляд, было бы автоматически прокручивать новые сообщения, если LongListSelector в настоящее время прокручивается вверх, но я не могу найти метод для определения текущей прокрутки (я вижу только LongListSelector.ScrollTo(), что не помогает).

Как я могу автоматически прокручивать новые сообщения, когда LongListSelector в настоящее время прокручивается вверху?

+0

Не могли бы вы объяснить, почему ScrollTo не помогает? Если вы предоставите объект «сообщение», который вы вставляете в свою коллекцию, он перейдет к нему. Это именно то, что вы хотели - не так ли? – eX0du5

+0

@ eX0du5, Да, это то, что я хочу. Но мне нужно включить автопрокрутку, только если LongListSelector в настоящее время прокручивается вверх. – BArtWell

ответ

2

Если вам нужно найти текущую позицию прокрутки, вам нужно получить полосу прокрутки внутри longlistselector с помощью VisualTreeHelper.

Функция выборки:

public static class VisualChildExtractHelper 
{ 

    public static T FindChildOfType<T>(DependencyObject root) where T : class 
    { 
    var queue = new Queue<DependencyObject>(); 
    queue.Enqueue(root); 

    while (queue.Count > 0) 
    { 
     DependencyObject current = queue.Dequeue(); 
     for (int i = VisualTreeHelper.GetChildrenCount(current) - 1; 0 <= i; i--) 
     { 
      var child = VisualTreeHelper.GetChild(current, i); 
      var typedChild = child as T; 
      if (typedChild != null) 
      { 
       return typedChild; 
      } 
      queue.Enqueue(child); 
     } 
    } 
    return null; 
    } 
} 

использование:

ScrollBar LongListSelectorScrollBar = VisualChildExtractHelper.FindChildOfType<ScrollBar>(yourLongListSelectorName); 

После того, что вы можете получить доступ к ScrollBar Value (или ValueChanged событие) и проверить, если он равен 0 (это означает, что longlistselector прокручивается в верх) или другое условие. Если вы можете использовать метод ScrollTo для LongListSelector для отображения элемента.

+0

Спасибо за ответ! Но 'VisualChildExtractHelper.FindChildOfType (yourLongListSelectorName)' всегда возвращает null. Где может быть проблема? – BArtWell

+0

В методе FindChildOfType child! = Null, но typedChild всегда равно null. Как я вижу, проблема здесь. Как это исправить? – BArtWell

+1

Извините, похоже, что LongListSelector не содержит scrollviewer. ScrollViewer находится внутри списка. Однако есть ScrollBar внутри LongListSelector и его свойства Value и ValueChanged. См. Мой обновленный ответ. –

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