ListView似乎不支持Scroll事件。我需要在列表滾動時調用一個函數;我會怎麼做呢?如何偵聽ListView中的滾動?
1
A
回答
6
爲什麼在列表滾動時需要調用函數?
如果您正在更改項目,因爲它滾動我建議將列表視圖設置爲虛擬。
或者你可以重寫ListView和做到這一點:
public class TestListView : System.Windows.Forms.ListView
{
private const int WM_HSCROLL = 0x114;
private const int WM_VSCROLL = 0x115;
public event EventHandler Scroll;
protected void OnScroll()
{
if (this.Scroll != null)
this.Scroll(this, EventArgs.Empty);
}
protected override void WndProc(ref System.Windows.Forms.Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_HSCROLL || m.Msg == WM_VSCROLL)
this.OnScroll();
}
}
0
下面是尊重每個ListView
的顯示模式的解決方案:
我們依靠的事實,作爲ListView
滾動時,項目的位置變化。如果我們檢查第一個ListViewItem
的Bounds
屬性中的更改,我們可以跟蹤是否發生了移動。
你需要一個Timer
控件添加到同一形成你ListView
並且它的Enabled
屬性設置爲True
(這意味着它會定期火而不必Start
版)。還要添加一個私有變量到您的表單類來記錄第一個項目的Bounds
。
private Rectangle _firstItemBounds = null;
當填充您的ListView
,這個變量設置爲第一個項目的Bounds
。例如:
private void Form1_Load(object sender, EventArgs e)
{
for (int i = 0; i < 1000; i++)
{
listView1.Items.Add(new ListViewItem("Item " + i));
}
_firstItemBounds = listView1.Items[0].Bounds;
}
然後添加一個處理程序Timer
的Tick
事件:
private void timer1_Tick(object sender, EventArgs e)
{
if (listView1.Items[0] == null)
{
return;
}
Rectangle bounds = listView1.Items[0].Bounds;
if (bounds != _firstItemBounds)
{
_firstItemBounds = bounds;
// Any scroll logic here
// ...
}
}
默認爲100ms的Timer Interval
似乎爲我工作得很好,但你可能需要調整,使之適合你的申請。
我希望這會有所幫助。
4
看來,最好的辦法是布賴恩的解決方案。但是,它只響應由滾動條生成的事件,但不響應鼠標中鍵的事件。
如果更改條件:
if (m.Msg == WM_HSCROLL || m.Msg == WM_VSCROLL)
this.OnScroll();
由:
if (m.Msg == 0x000c2c9)
this.OnScroll();
現在respods在列表視圖所有滾動事件。
相關問題
- 1. 如何偵聽listView是從下往上滾動的?
- 2. 如何讓borderContainer偵聽滾動事件?
- 3. Lua Corona - 如何在滑動過程中偵聽widget.newScrollView偵聽器
- 4. 收聽ListView中的滾動條更改
- 5. Java:如何註冊偵聽JFrame運動的偵聽器
- 6. 滾動查看和觸摸偵聽器
- 7. 「滾動」事件偵聽器不工作
- 8. 如何讓偵聽器偵聽TreeMap中的更改?
- 9. 如何添加事件偵聽器來滾動內容?
- 10. ListView項目的自定義偵聽器
- 11. 如何在ListView中使用偵聽器方法?
- 12. 滾動窗格中所有複選框的操作偵聽器?
- 13. ASPNET CORE如何啓動以偵聽httprequest?
- 14. ListView onItemSelected偵聽器不工作
- 15. RecyclerView滾動偵聽器的方法onscolled調用自動不滾動
- 16. 如何幾個滾動監聽綁定在一個ListView?
- 17. 如何停止ListView中的超滾動?
- 18. 鼠標偵聽器和動作偵聽器的區別?
- 19. 如何使用偵聽器/偵聽器捕獲所有動作事件
- 20. 如何禁用ListView滾動?
- 21. 如何設置偵聽器?
- 22. 如何偵聽卸載apk?
- 23. 如何禁用GridView中的ListView滾動條和滾動條
- 24. 多個div的窗口滾動偵聽器一次?
- 25. 單擊事件後滾動偵聽器上的jQuery
- 26. 如何在動作監聽器上控制焦點偵聽器?
- 27. 帶有CursorAdapter的ListView中的複選框偵聽器
- 28. ListView中的CheckBox偵聽器的業務邏輯
- 29. 在動作偵聽器偵聽事件後,Java gui不打印
- 30. 如何在android listview中滾動工作?