Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1

Оповещение о достижении самого низа списка в ListView, при его прокрутке.

22.06.2011, 22:40. Показов 3812. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как сделать так, чтобы при достижении полосы прокрутки в ListView самого низа списка срабатывало какое либо действие (метод мой). Может есть событие какое-то? Я что-то не нашёл.

То есть у меня есть массив данных, они отображаются в ListView, при старте проги грузится с сервера 10 элементов, мне надо прокрутить список в самый низ и подгрузить ещё 10 и так постоянно. Возможно вообще это?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.06.2011, 22:40
Ответы с готовыми решениями:

ListView лагает при прокрутке загруженного списка
ListView лагает при прокрутке загруженного списка, при загрузке 500 строк, при прокрутке, лагов нет, при загрузке 1000+ строк начинаются...

При прокрутке listview изображения подгружаются, но происходит "скачок" списка
Здравствуйте. Использую listview и item с текстом и изображениями. При прокрутке listview изображения подгружаются, но происходит...

Растянуть блок до самого низа
Не могу растянуть блок до самого низа, красной полоской показано до куда нужно растянуть Сам код: .sidebar { width:26.6%; ...

8
101 / 86 / 6
Регистрация: 08.04.2010
Сообщений: 169
23.06.2011, 12:24
может поможет http://stackoverflow.com/quest... vm-wpf-app
0
burning1ife
 Аватар для kenny69
1466 / 1287 / 294
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
23.06.2011, 16:02
я так понял, вы хотите, чтобы не пришлось дожидаться загрузки всех элементов, и подгружались только видимые на данный момент, тогда стоит посмотреть https://www.cyberforum.ru/wpf-... 92302.html
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
25.06.2011, 13:25  [ТС]
Цитата Сообщение от al.k Посмотреть сообщение
Что-то не понял как этот код можно использовать и вообще не ясно решает ли он проблему.

Цитата Сообщение от kenny69 Посмотреть сообщение
я так понял, вы хотите, чтобы не пришлось дожидаться загрузки всех элементов, и подгружались только видимые на данный момент, тогда стоит посмотреть https://www.cyberforum.ru/wpf-... 92302.html
Нет, я гружу с сервера данные. То есть я в коде прописал, нажали на ListBoxItem в ListBox, то с сервера подгрузилось скажем 10 элементов. Потом прокрутил список ниже и должно подрузиться с сервера ещё 10 элементов в ObservableCollection<T>. Но как узнать, что я достиг самого низа в ListView я не знаю. Ждать мне не приходится, там всё вроде как быстро работает (хотя на машинах с слабым инетом не тестил).
0
101 / 86 / 6
Регистрация: 08.04.2010
Сообщений: 169
25.06.2011, 14:29
listBox1.ScrollIntoView(listBox1.Items[listBox1.Items.Count - 1]);

http://social.msdn.microsoft.c... 006bbeb55/

Добавлено через 7 минут
не совсем то что вам нужно, сори
0
burning1ife
 Аватар для kenny69
1466 / 1287 / 294
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
25.06.2011, 22:22
http://iloktev.ru/wps/tag/net
1
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
25.06.2011, 22:35  [ТС]
Конечно спасибо за помощь, но думаю это не вариант. Если всё таки не найду или тут не напишут способ, как это осуществить, то придётся как-то по другому увеличивать коллекцию с данными.
0
burning1ife
 Аватар для kenny69
1466 / 1287 / 294
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
25.06.2011, 22:53
в ListView же есть событие ScrollViewer.ScrollChanged
XML
1
 <ListView Height="50" ScrollViewer.ScrollChanged="ListView_ScrollChanged">
в нем покопайся в свойствах ScrollChangedEventArgs

C#
1
   private void ListView_ScrollChanged(object sender, ScrollChangedEventArgs e)
2
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
09.07.2011, 16:51  [ТС]
Написал такую маленькую программку, чтобы попытаться понять как мне выяснить, то что я пытаюсь выяснить (см. название темы).

XAML код главного окна
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<Window x:Class="Wpf_ScrollViewer_ScrollChanged.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="392" Width="587">
  <Grid>
    <ListView Margin="12,174,12,46" Name="listView" SelectionMode="Single" ScrollViewer.ScrollChanged="listView_ScrollChanged">
      <ListView.View>
        <GridView>
          <GridViewColumn Header="Время" DisplayMemberBinding="{Binding Date}" Width="70" />
          <GridViewColumn Header="Событие" DisplayMemberBinding="{Binding Event}" Width="150" />
        </GridView>
      </ListView.View>
    </ListView>
    <GroupBox Header="listView_ScrollChanged" Margin="12,2,12,0" Name="groupBox1" Height="167" VerticalAlignment="Top">
      <Grid>
        <TextBlock Height="17" HorizontalAlignment="Left" Margin="6,6,0,0" Name="tBl_ExtentHeight" Text="ExtentHeight = " VerticalAlignment="Top" />
        <TextBlock Height="17" HorizontalAlignment="Left" Margin="6,23,0,0" Name="tBl_ExtentHeightChange" Text="ExtentHeightChange = " VerticalAlignment="Top" />
        <TextBlock Height="17" HorizontalAlignment="Left" Margin="5,39,0,0" Name="tBl_VerticalChange" Text="VerticalChange = " VerticalAlignment="Top" />
        <TextBlock HorizontalAlignment="Left" Margin="5,56,0,0" Name="tBl_VerticalOffset" Text="VerticalOffset = " Height="17" VerticalAlignment="Top" />
        <TextBlock Height="17" HorizontalAlignment="Left" Margin="5,74,0,0" Name="tBl_ViewportHeight" Text="ViewportHeight = " VerticalAlignment="Top" />
        <TextBlock Height="17" HorizontalAlignment="Left" Margin="6,91,0,0" Name="tBl_ViewportHeightChange" Text="ViewportHeightChange = " VerticalAlignment="Top" />
      </Grid>
    </GroupBox>
    <Button Content="Добавить" Height="23" HorizontalAlignment="Left" Margin="14,0,0,17" Name="btnAddElements" VerticalAlignment="Bottom" Width="75" ToolTip="Добавить элементов в список" Click="btnAddElements_Click" />
  </Grid>
</Window>


C# код главного окна
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
 
namespace Wpf_ScrollViewer_ScrollChanged
{
  public partial class MainWindow : Window
  {
    ObservableCollection<TestClass> testClassObsColl = new ObservableCollection<TestClass>();
 
    public MainWindow()
    {
      InitializeComponent();
      listView.ItemsSource = testClassObsColl;
 
      for (int i = 0; i < 10; i++)
        testClassObsColl.Add(new TestClass(DateTime.Now, "Новое событие " + i));
    }
 
    private void btnAddElements_Click(object sender, RoutedEventArgs e)
    {
      int quantity = testClassObsColl.Count;
      int targetQuantity = quantity + 10;
      for (int i = quantity; i < targetQuantity; i++)
      {
        testClassObsColl.Add(new TestClass(DateTime.Now, "Новое событие " + i));
      }
    }
 
    private void listView_ScrollChanged(object sender, ScrollChangedEventArgs e)
    {
      tBl_ExtentHeight.Text = string.Format("ExtentHeight = {0}", e.ExtentHeight);
      tBl_ExtentHeightChange.Text = string.Format("ExtentHeightChange = {0}", e.ExtentHeightChange);
      tBl_VerticalChange.Text = string.Format("VerticalChange = {0}", e.VerticalChange);
      tBl_VerticalOffset.Text = string.Format("VerticalOffset = {0}", e.VerticalOffset);
      tBl_ViewportHeight.Text = string.Format("ViewportHeight = {0}", e.ViewportHeight);
      tBl_ViewportHeightChange.Text = string.Format("ViewportHeightChange = {0}", e.ViewportHeightChange);
    }
  }
}


Класс испольуемый для отображения в ListView
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using System.ComponentModel;
 
namespace Wpf_ScrollViewer_ScrollChanged
{
  public class TestClass : INotifyPropertyChanged
  {
    DateTime date;
    string _event;
 
    public DateTime Date
    {
      get { return date; }
      set { date = value; OnPropertyChange("Date"); }
    }
 
    public string Event
    {
      get { return _event; }
      set { _event = value; OnPropertyChange("Event"); }
    }
 
    public TestClass(DateTime Date, string Event)
    {
      this.Date = Date;
      this.Event = Event;
    }
 
    public TestClass()
    {
    }
 
    public event PropertyChangedEventHandler PropertyChanged;
 
    protected void OnPropertyChange(string propertyName)
    {
      if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
  }
}


Запустил, потестил так и сяк, но что-то не осилил. Всё же может кто знает как определить?

Добавлено через 27 минут
Кажись плохо тестил, теперь вроде бы всё гуд. Сейчас доделаю и покажу код, как определить можно. Если всё таки правильно делаю.

Добавлено через 37 минут
Короче вроде бы нашёл решение. Пока мало тестил, но вроде пашет как надо. Если можно как-то лучше расчитать и кому-то это надо, то не плохо было бы увидеть другой способ подсчёта.

Вот так вроде считает правильно:
Попытка расчёта
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
        private void listView_ScrollChanged(object sender, ScrollChangedEventArgs e)
        {
            tBl_ExtentHeight.Text = string.Format("ExtentHeight = {0}", e.ExtentHeight);
            tBl_ExtentHeightChange.Text = string.Format("ExtentHeightChange = {0}", e.ExtentHeightChange);
            tBl_VerticalChange.Text = string.Format("VerticalChange = {0}", e.VerticalChange);
            tBl_VerticalOffset.Text = string.Format("VerticalOffset = {0}", e.VerticalOffset);
            tBl_ViewportHeight.Text = string.Format("ViewportHeight = {0}", e.ViewportHeight);
            tBl_ViewportHeightChange.Text = string.Format("ViewportHeightChange = {0}", e.ViewportHeightChange);
 
            if (IsLoaded)
            {
                //Здесь начинается расчёт позиции скрола!
                if (e.VerticalOffset == 0)
                {
                    tBl_EventScroll.Text = "Событие скролла: Достиг верха";
                }
                else if (e.ExtentHeight - e.ViewportHeight - e.VerticalOffset == 0)
                {
                    tBl_EventScroll.Text = "Событие скролла: Достиг низа";
                }
                else if (e.VerticalOffset + e.ViewportHeight >= e.ExtentHeight / 2 + e.ExtentHeight / 6)
                {
                    tBl_EventScroll.Text = "Событие скролла: После середины";
                }
                else if (e.VerticalOffset + e.ViewportHeight <= e.ExtentHeight / 2 + e.ExtentHeight / 6)
                {
                    tBl_EventScroll.Text = "Событие скролла: До середины";
                }
                else tBl_EventScroll.Text = "Событие скролла: ";
            }
        }


Добавлено через 1 час 54 минуты
Окончательный вариант, работает правильно (надеюсь кому нибудь пригодится):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
    public partial class ListViewMyControl : UserControl
    {
        public ListViewMyControl() 
        {
            InitializeComponent();
            IsVisibleButtonsAddToFavorites = true;
        }
 
        //..................
        //..................
        private void ListView_ScrollChanged(object sender, ScrollChangedEventArgs e)
        {
            if (IsLoaded)
            {
                switch (GetScrollThumbPosition(e))
                {
                    case ScrollThumbPosition.ReachedTheTop: //Что-то делаем
                        break;
                    case ScrollThumbPosition.UntilTheMid: //Что-то делаем
                        break;
                    case ScrollThumbPosition.AfterTheMid: //Что-то делаем
                        break;
                    case ScrollThumbPosition.ReachedTheBottom: //Что-то делаем
                        break;
                }
            }
        }
 
        private ScrollThumbPosition GetScrollThumbPosition(ScrollChangedEventArgs e)
        {
            if (e.VerticalOffset == 0)
                return ScrollThumbPosition.ReachedTheTop;
            else if (e.ExtentHeight - e.ViewportHeight - e.VerticalOffset == 0)
                return ScrollThumbPosition.ReachedTheBottom;
            else if (e.VerticalOffset + e.ViewportHeight >= e.ExtentHeight / 2 + (e.ExtentHeight - ((ScrollViewer)e.OriginalSource).ScrollableHeight) / 2)
                return ScrollThumbPosition.AfterTheMid;
            else if (e.VerticalOffset + e.ViewportHeight <= e.ExtentHeight / 2 + (e.ExtentHeight - ((ScrollViewer)e.OriginalSource).ScrollableHeight) / 2)
                return ScrollThumbPosition.UntilTheMid;
 
            throw new Exception("Ошибка расчёта положения ползунка скрола"); 
        }
 
        private enum ScrollThumbPosition : byte
        {
            ReachedTheTop, UntilTheMid, AfterTheMid, ReachedTheBottom
        }
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.07.2011, 16:51
Помогаю со студенческими работами здесь

Почему html может загружается с самого низа
В процессе верстки каким-то чудным образом случилось так что мой одностраничник начинает отображаться с конца документа (я сразу вижу...

Как изменить цвет пункта ListView при нажатии на него и сохранять его цвет при проматывании списка?
Здравствуйте, подскажите, пожалуйста, как изменить цвет пункта ListView при нажатии на него и сохранять его цвет при проматывании списка? ...

Белый фон при прокрутке listview и actionbar в android 2.1
При прокрутке ListView на Android 2.3 появляется белый фон. Ставил Cache Color Hint на прозрачный или на цвет фона, не помогает. Как это...

Сохранить измененные значения EditText в ListView при прокрутке
Добрый день, прошу помощи, т.к. уже долго и безрезультатно пытаюсь решить следующую задачу: Есть Листвью с названиями товаров ,...

Как отключить обновление адаптера ListView при прокрутке?
Всем привет! имеется листвью, туда я загружаю собственный адаптер и одновременно загружаю картинки из интернета. Все хорошо, все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru