我添加了这个
public class MyListView : ListView
{
public event EventHandler<EventArgs> Scrolled;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
const int wm_vscroll = 0x115;
if (m.Msg == wm_vscroll && Scrolled != null)
{
Scrolled(this, new EventArgs());
}
}
}
当我滚动鼠标滚轮时,它会完美滚动列表,我的滚动事件不会触发。
我试过挂钩MouseWheel,但滚动发生在mousewheel事件返回到窗口后,但仍然没有调用Scroll事件。
编辑: - 我添加了一个调用我的更新代码的OnMouseWheel事件,但是在滚动可见区域之前调用它,所以我的更新代码错过了某些部分。
我希望mousewheel事件滚动可见区域,然后调用onScroll事件, 要么 onscroll事件被调用为滚动可见区域的鼠标滚轮的副产品
答案 0 :(得分:0)
陷阱WM_MOUSEWHEEL为我工作:
public class MyListView : ListView
{
private const int WM_MOUSEWHEEL = 0x20a;
public event EventHandler<EventArgs> Scrolled;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_MOUSEWHEEL && Scrolled != null)
{
Scrolled(this, new EventArgs());
}
}
}
答案 1 :(得分:0)
默认列表视图的可视树具有ScrollViewer控件。 ScrollViewer覆盖OnMouseWheel并设置e.handled = true, 如果要处理此事件,则必须使用EventManager.RegisterClassHandler(Type classType,RoutedEvent routedEvent,Delegate handler,true); 即使已将路由事件的参数标记为已处理,也将调用此类处理函数; 试试吧:
class CustomListView: ListView
{
public CustomListView()
{
EventManager.RegisterClassHandler(typeof(CustomListView), MouseWheelEvent, new RoutedEventHandler(OnMouseWheel), true);
}
internal static void OnMouseWheel(object sender, RoutedEventArgs e)
{
//Do something you want
}
}