Обработка события прокрутки на listview в c#

XKCD's GOTO Comic

мой коллега А сказал, что единственная причина использовать GOTO состоит в том при программировании себя до сих пор в угол, что это - единственный выход. Другими словами, надлежащий дизайн загодя и Вы не должны будете использовать GOTO позже.

я думал, что этот комик иллюстрирует, что красиво "Я мог реструктурировать поток программы или использовать тот мало 'GOTO' вместо этого". GOTO является слабым выходом, когда у Вас есть слабый дизайн. Velociraptors охотятся на слабое .

16
задан murasaki5 5 December 2009 в 08:51
поделиться

3 ответа

Вам нужно будет добавить поддержку в класс ListView, чтобы вы могли получать уведомления о событиях прокрутки. Добавьте новый класс в свой проект и вставьте приведенный ниже код. Скомпилировать. Перетащите новый элемент управления listview из верхней части панели инструментов в форму. Реализуйте обработчик для нового события Scroll.

using System;
using System.Windows.Forms;

    class MyListView : ListView {
      public event ScrollEventHandler Scroll;
      protected virtual void OnScroll(ScrollEventArgs e) {
        ScrollEventHandler handler = this.Scroll;
        if (handler != null) handler(this, e);
      }
      protected override void WndProc(ref Message m) {
        base.WndProc(ref m);
        if (m.Msg == 0x115) { // Trap WM_VSCROLL
          OnScroll(new ScrollEventArgs((ScrollEventType)(m.WParam.ToInt32() & 0xffff), 0));
        }
      }
    }

Помните, что позиция прокрутки (ScrollEventArgs.NewValue) не имеет смысла, она зависит от количества элементов в ListView. Я установил для него значение 0. Следуя вашим требованиям, вы хотите следить за уведомлением ScrollEventType.EndScroll, чтобы узнать, когда пользователь прекратил прокрутку. Все остальное поможет вам обнаружить, что пользователь начал прокрутку. Например:

ScrollEventType mLastScroll = ScrollEventType.EndScroll;

private void myListView1_Scroll(object sender, ScrollEventArgs e) {
  if (e.Type == ScrollEventType.EndScroll) scrollEnded();
  else if (mLastScroll == ScrollEventType.EndScroll) scrollStarted();
  mLastScroll = e.Type;
}
21
ответ дан 30 November 2019 в 21:45
поделиться

См. Этот пост Событие прокрутки ListView

Используйте собственный класс окна для прослушивания для прокрутки сообщений на список. Будет работать с любым управлением.

1
ответ дан 30 November 2019 в 21:45
поделиться

Поймать событие прокрутки теперь легко в .net 4.

Поймайте событие Loaded от вашего ListView (m_ListView) и сделайте следующее:

        if (VisualTreeHelper.GetChildrenCount(m_ListView) != 0)
        {
            Decorator border = VisualTreeHelper.GetChild(m_ListView, 0) as Decorator;
            ScrollViewer sv = border.Child as ScrollViewer;
            sv.ScrollChanged += ScrollViewer_ScrollChanged;
        }

затем реализуйте функцию ScrollViewer_ScrollChanged:

    private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
    {
        ...
    }
0
ответ дан 30 November 2019 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: