Прокрутите LongListSelector при добавлении нового элемента

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

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

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

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


person BArtWell    schedule 17.09.2014    source источник
comment
Не могли бы вы объяснить, почему ScrollTo бесполезен? Если вы предоставите объектное сообщение, которое вы вставили в свою коллекцию, оно будет прокручиваться до него. Это именно то, что вы хотели, верно?   -  person eX0du5    schedule 18.09.2014
comment
@ eX0du5, Да, это то, что я хочу. Но мне нужно включить автопрокрутку только в том случае, если LongListSelector в данный момент прокручивается вверх.   -  person BArtWell    schedule 18.09.2014


Ответы (1)


Если вам нужно найти текущую позицию прокрутки, вам нужно получить полосу прокрутки внутри селектора длинного списка с помощью 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 (или событию ValueChanged) и проверить, равно ли оно 0 (это означает, что селектор длинного списка прокручивается вверх) или другому условию. Если это так, вы можете использовать метод ScrollTo для LongListSelector, чтобы отобразить элемент.

person Валера Галанин    schedule 17.09.2014
comment
Спасибо за ответ! Но VisualChildExtractHelper.FindChildOfType<ScrollViewer>(yourLongListSelectorName) всегда возвращает ноль. Где может быть проблема? - person BArtWell; 18.09.2014
comment
В методе FindChildOfType child!=null, но typedChild всегда имеет значение null. Как я вижу проблема здесь. Как это исправить? - person BArtWell; 18.09.2014
comment
Извините, кажется, что LongListSelector не содержит scrollviewer. ScrollViewer находится внутри списка. Однако внутри LongListSelector есть ScrollBar, его свойство Value и событие ValueChanged. Смотрите мой обновленный ответ. - person Валера Галанин; 18.09.2014