@H_301_1@我有一个列表视图,使用后台工作器生成缩略图.当列表视图被滚动时,我想暂停后台工作并获取滚动区域的当前值,当用户停止滚动列表视图时,根据滚动区域的值从项目开始恢复backgroundworker.
是否可以处理列表视图的滚动事件?如果是的话?如果不是那么什么是一个很好的替代,根据我上面描述的?
解决方法@H_301_6@
您必须添加对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;
}
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; }