WPF ListView: пользовательское поведение прокрутки - PullRequest
1 голос
/ 22 ноября 2010

Есть ли способ сохранить прокрутку ListView по вертикали при обновлении данных через привязку к свойству ItemsSource в ListView? Кажется, я не могу найти свойство ни в ListView, ни в его базовом элементе управления GridView для достижения желаемого результата. Я бы хотел, чтобы он прокручивался так, чтобы новейшая информация всегда была видна пользователю. Полоса прокрутки уже появляется при добавлении строк в элемент управления, но самая последняя строка не отображается.

Должен ли я рассмотреть возможность использования другого типа элемента управления с возможностью автоматической прокрутки? У меня есть только два столбца: один содержит DateTimes, а другой содержит простую строку. Я начинаю думать, что мой выбор контроля может быть слишком ограниченным.

Мой XAML выглядит примерно так:

<ListView ItemsSource="{Binding Updates}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Timestamp" DisplayMemberBinding="{Binding TimeStamp}"/>
            <GridViewColumn DisplayMemberBinding="{Binding UpdateString}" />
        </GridView>
    </ListView.View>
</ListView>

Ответы [ 4 ]

2 голосов
/ 14 декабря 2010

Я нашел способ выставить объект ScrollViewer ListView для управления прокруткой.Мой DataContext содержит коллекцию, полученную из ObservableCollection, и в коде, который я написал, я связал обработчик событий с событием CollectionChanged.Я использовал Decorator, чтобы выставить первого потомка ListView (границы), а его дочерний элемент - ScrollViewer.Оттуда я вызываю метод ScrollToBottom() для достижения желаемого поведения.

В коде моего просмотра, который содержит ListView, это то, как он закодирован

MyViewModel viewModel = DataContext as MyViewModel;

viewModel.MyCollection.CollectionChanged += (sender,e) =>
{
    if(e.NewItems != null)
    {
        Decorator border = VisualTreeHelper.GetChild(SummaryListView, 0) as Decorator;
        ScrollViewer scroll = border.Child as ScrollViewer;
        scroll.ScrollToBottom();
    }
};

Iузнал, как выставить ScrollViewer в сообщение в блоге Anshulee для WindowsClient .

Редактировать Ранее я проверял, достигнуто ли максимальное количество элементов в пользовательской коллекции.а затем прокручивается до дна.Это не сработало так хорошо при разных разрешениях экрана, потому что приложение может отображать 15 строк в ListView на одном компьютере и 25 строк на другом.Так что теперь у меня всегда есть прокрутка вниз, чтобы отобразить самый новый элемент.

1 голос
/ 22 ноября 2010

вам следует использовать объект scrollviewer, он будет автоматически прокручивать при необходимости его содержимое (вы также можете указать, хотите ли вы всегда горизонтальную или вертикальную прокрутку независимо от того, где это необходимо или нет, а также некоторые другие вещи)

<ScrollViewer>
   <GridView>
       <!-- gridview definition -->
   <GridView>
</ScrollViewer>

подробнее о MSDN

0 голосов
/ 14 декабря 2010

В Listview есть метод с именем ScrollIntoView(object item).

. Он будет прокручивать Listview в положение, в котором находится указанный элемент.

Если у вас есть коллекция, связанная с Listview.Вы можете вызвать этот метод, когда ваша коллекция изменилась, например:

private void myCollectionChanged()
{
    myListView.ScrollIntoView(myCollection.Last());
}
0 голосов
/ 07 декабря 2010

Я почти уверен, что под прикрытиями используется VirtualizingStackPanel, что означает, что предметов не существует, пока они не понадобятся.Поэтому, если у вас есть 15000 элементов, рендеринг этих 15000 элементов раньше необходимого не имеет смысла.

Более простой подход может заключаться в принудительной сортировке, чтобы самые новые данные оставались сверху.Затем он будет выглядеть как толкание предметов вниз, но они будут самыми старыми предметами, поэтому прокрутка, чтобы увидеть их, не имеет значения, если пользователь не инициирует это.

...