0

我添加了这个

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,但是在鼠标滚轮事件返回窗口之后发生滚动,但仍然没有调用滚动事件。

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

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

4

2 回答 2

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

}
于 2013-11-06T15:50:38.940 回答
0

默认列表视图的可视化树具有 ScrollViewer 控件。ScrollViewer 覆盖 OnMouseWheel 并设置 e.handled = true,如果要处理这个事件,必须使用 EventManager.RegisterClassHandler(Type classType, RoutedEvent routedEvent,Delegate handler,true); 即使路由事件的参数已被标记为已处理,也调用此类处理程序为 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
    }
}
于 2018-11-02T03:34:01.950 回答