Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Casper-SC
Эксперт .NET
3602 / 1814 / 352
Регистрация: 27.03.2010
Сообщений: 5,106
Записей в блоге: 1
#1

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

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

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

То есть у меня есть массив данных, они отображаются в ListView, при старте проги грузится с сервера 10 элементов, мне надо прокрутить список в самый низ и подгрузить ещё 10 и так постоянно. Возможно вообще это?

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2011, 22:40
Ответы с готовыми решениями:

Как сделать, чтобы в ListView при нажатии на позиции выводилось его название?
Добрый ночи такая небольшая проблема возникла как сделать чтобы в listview при...

ListView лагает при прокрутке загруженного списка
ListView лагает при прокрутке загруженного списка, при загрузке 500 строк, при...

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

Растянуть блок до самого низа
Не могу растянуть блок до самого низа, красной полоской показано до куда нужно...

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

8
al.k
99 / 84 / 6
Регистрация: 08.04.2010
Сообщений: 169
23.06.2011, 12:24 #2
может поможет http://stackoverflow.com/questions/2...a-mvvm-wpf-app
0
kenny69
burning1ife
1371 / 1198 / 282
Регистрация: 21.09.2008
Сообщений: 3,356
Записей в блоге: 9
23.06.2011, 16:02 #3
я так понял, вы хотите, чтобы не пришлось дожидаться загрузки всех элементов, и подгружались только видимые на данный момент, тогда стоит посмотреть http://www.cyberforum.ru/wpf-silverl...ead292302.html
0
Casper-SC
Эксперт .NET
3602 / 1814 / 352
Регистрация: 27.03.2010
Сообщений: 5,106
Записей в блоге: 1
25.06.2011, 13:25  [ТС] #4
Цитата Сообщение от al.k Посмотреть сообщение
Что-то не понял как этот код можно использовать и вообще не ясно решает ли он проблему.

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

http://social.msdn.microsoft.com/For...-302006bbeb55/

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

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

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
09.07.2011, 16:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2011, 16:51

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

Подгрузка данных при достижении конца списка
подскажите как реализовать данное требование, какой список использовать, и как...

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru