将Scroll事件添加到ListView,鼠标滚轮移动它,但滚动事件不存档

时间:2013-11-06 14:36:13

标签: c# .net listview

我添加了这个

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事件被调用为滚动可见区域的鼠标滚轮的副产品

2 个答案:

答案 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
    }
}
相关问题