繁体   English   中英

将Scroll事件添加到ListView,并通过鼠标滚轮将其移动,但滚动事件不起作用

[英]added Scroll event to ListView, and mouse wheel moves it, but scroll event doesn't file

我添加了这个

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事件返回到Windows之后,但仍然不调用Scroll事件。

编辑:-我添加了一个OnMouseWheel事件,该事件调用我的更新代码,但是在滚动可见区域之前调用了该事件,因此我的更新代码缺少某些部分。

我希望mousewheel事件滚动可见区域,然后调用onScroll事件,或者让onscroll事件作为mousewheel滚动可见区域的副产品来调用

诱捕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());
        }
    }

}

默认listview的可视树具有ScrollViewer控件。 ScrollViewer重写OnMouseWheel并设置e.handled = true,如果要处理此事件,则必须使用EventManager.RegisterClassHandler(Type classType,RoutedEvent routedEvent,Delegate handler,true); 即使已将路由事件的参数标记为已处理,也将调用此类处理程序;否则为true;否则为false。 试试吧:

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
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM