2009-12-05 1 views
12

में सूचीदृश्य पर स्क्रॉल ईवेंट को संभालना मेरे पास एक सूचीदृश्य है जो पृष्ठभूमि कार्यकर्ता का उपयोग करके थंबनेल उत्पन्न करता है। जब सूचीदृश्य स्क्रॉल किया जा रहा है, तो मैं पृष्ठभूमि कार्यकर्ता को रोकना चाहता हूं और स्क्रॉल किए गए क्षेत्र का वर्तमान मान प्राप्त करना चाहता हूं, जब उपयोगकर्ता सूचीदृश्य को स्क्रॉल करना बंद कर देता है, तो स्क्रॉल किए गए क्षेत्र के मान के अनुसार आइटम से शुरू होने वाले पृष्ठभूमि कार्यकर्ता को फिर से शुरू करें।सी #

क्या सूचीदृश्य की स्क्रॉल घटना को संभालना संभव है? अगर हाँ कैसे? यदि नहीं, तो ऊपर वर्णित अनुसार के अनुसार एक अच्छा विकल्प क्या है?

उत्तर

16

आपको ListView क्लास में समर्थन जोड़ना होगा ताकि आपको स्क्रॉल ईवेंट के बारे में अधिसूचित किया जा सके। अपनी परियोजना में एक नई कक्षा जोड़ें और नीचे दिए गए कोड को पेस्ट करें। संकलित करें। टूलबॉक्स के शीर्ष से नए फॉर्मव्यू नियंत्रण को अपने फॉर्म पर छोड़ दें। नए स्क्रॉल ईवेंट के लिए एक हैंडलर लागू करें।

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 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; 
} 
+0

बहुत बहुत धन्यवाद। यह वही है जो मैं हासिल करने की कोशिश कर रहा हूं। – murasaki5

+3

WM_VSCROLL संदेश के साथ कुछ सीमाएं देखने के लिए http://stackoverflow.com/questions/1176703/listview-onscroll-event/1182232#1182232 पढ़ें। – Grammarian

+0

इस उत्तर ने ग्रिडलाइन – Mandrake

1

इस पोस्ट देशी विंडो वर्ग ListView Scroll Event

उपयोग लिस्टबॉक्स पर स्क्रॉल संदेशों के लिए सुनने के लिए देखें। किसी भी नियंत्रण के साथ काम करेंगे।

+0

पोस्ट के आधार पर @ एड्रियान स्टेंडर ने स्क्रॉल घटनाओं को बढ़ाने के लिए अपनी कक्षा पोस्ट की है। http://stackoverflow.com/a/35645892/254215 – Dib

0

स्क्रॉल अब आसानी से .net में अपने ListView (m_ListView) से 4.

पकड़ने लोडेड घटना से किया जाता है घटना पकड़ने और ऐसा करते हैं:

 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) 
    { 
     ... 
    } 
+1

के साथ नेट फ्रेमवर्क 2.0 पर एक बुरा बग हल किया है यह WPF के लिए है। उपयोगी जानकारी लेकिन सवाल विंडोज़ फॉर्मों के लिए है। – flobadob

0

उस पोस्ट के आधार पर @Adriaan Stander poste स्क्रॉल घटनाओं को बढ़ाने के लिए मेरी कक्षा नीचे है।

internal class ControlScrollListener : NativeWindow, IDisposable 
{ 
    public event ControlScrolledEventHandler ControlScrolled; 
    public delegate void ControlScrolledEventHandler(object sender, EventArgs e); 

    private const uint WM_HSCROLL = 0x114; 
    private const uint WM_VSCROLL = 0x115; 
    private readonly Control _control; 

    public ControlScrollListener(Control control) 
    { 
     _control = control; 
     AssignHandle(control.Handle); 
    } 

    protected bool Disposed { get; set; } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    private void Dispose(bool disposing) 
    { 
     if (Disposed) return; 

     if (disposing) 
     { 
      // Free other managed objects that implement IDisposable only 
     } 

     // release any unmanaged objects 
     // set the object references to null 
     ReleaseHandle(); 

     Disposed = true; 
    } 

    protected override void WndProc(ref Message m) 
    { 
     HandleControlScrollMessages(m); 
     base.WndProc(ref m); 
    } 

    private void HandleControlScrollMessages(Message m) 
    { 
     if (m.Msg == WM_HSCROLL | m.Msg == WM_VSCROLL) 
     { 
      if (ControlScrolled != null) 
      { 
       ControlScrolled(_control, new EventArgs()); 
      } 
     } 
    } 
} 

इतना है कि यह प्रयोग करें ...

एक क्षेत्र घोषित करें: में

_processListViewScrollListener = new ControlScrollListener(ProcessesListView); 

वायर:

private ControlScrollListener _processListViewScrollListener; 

नियंत्रण जो आप को पता है की जरूरत है issrolling साथ यह इन्स्तांत एक हैंडलर:

_processListViewScrollListener.ControlScrolled += ProcessListViewScrollListener_ControlScrolled; 

हैंडलर घटना:

void ProcessListViewScrollListener_ControlScrolled(object sender, EventArgs e) 
{ 
    // do what you need to do 
} 

उठाया स्थिति में घटना args और अधिक उपयोगी जानकारी शामिल करने के लिए बदलाव किया जा सकता है। मुझे बस इतना पता होना चाहिए कि मेरा नियंत्रण स्क्रॉल किया गया था!

+0

माउस व्हील स्क्रॉल को संभाल नहीं करता है। स्क्रॉलबार का उपयोग करना है। 'निजी कॉन्स यूआईंट WM_MOUSEWHEEL = 0x020A जोड़ने की आवश्यकता है, यदि आप इसे चाहते हैं। – rism