Форум программистов, компьютерный форум, киберфорум
Наши страницы

C#: WPF, UWP и Silverlight

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Casper-SC
Эксперт .NET
3521 / 1740 / 183
Регистрация: 27.03.2010
Сообщений: 4,927
Записей в блоге: 1
#1

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

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

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

То есть у меня есть массив данных, они отображаются в ListView, при старте проги грузится с сервера 10 элементов, мне надо прокрутить список в самый низ и подгрузить ещё 10 и так постоянно. Возможно вообще это?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2011, 22:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Оповещение о достижении самого низа списка в ListView, при его прокрутке. (C# WPF):

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

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

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

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

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

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

8
al.k
97 / 82 / 1
Регистрация: 08.04.2010
Сообщений: 169
23.06.2011, 12:24 #2
может поможет http://stackoverflow.com/questions/2...a-mvvm-wpf-app
0
kenny69
burning1ife
1359 / 1186 / 166
Регистрация: 21.09.2008
Сообщений: 3,339
Записей в блоге: 9
23.06.2011, 16:02 #3
я так понял, вы хотите, чтобы не пришлось дожидаться загрузки всех элементов, и подгружались только видимые на данный момент, тогда стоит посмотреть http://www.cyberforum.ru/wpf-silverl...ead292302.html
0
Casper-SC
Эксперт .NET
3521 / 1740 / 183
Регистрация: 27.03.2010
Сообщений: 4,927
Записей в блоге: 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
97 / 82 / 1
Регистрация: 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
1359 / 1186 / 166
Регистрация: 21.09.2008
Сообщений: 3,339
Записей в блоге: 9
25.06.2011, 22:22 #6
http://iloktev.ru/wps/tag/net
1
Casper-SC
Эксперт .NET
3521 / 1740 / 183
Регистрация: 27.03.2010
Сообщений: 4,927
Записей в блоге: 1
25.06.2011, 22:35  [ТС] #7
Конечно спасибо за помощь, но думаю это не вариант. Если всё таки не найду или тут не напишут способ, как это осуществить, то придётся как-то по другому увеличивать коллекцию с данными.
0
kenny69
burning1ife
1359 / 1186 / 166
Регистрация: 21.09.2008
Сообщений: 3,339
Записей в блоге: 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
3521 / 1740 / 183
Регистрация: 27.03.2010
Сообщений: 4,927
Записей в блоге: 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
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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