【问题标题】:added Scroll event to ListView, and mouse wheel moves it, but scroll event doesn't file将滚动事件添加到 ListView,鼠标滚轮移动它,但滚动事件不归档
【发布时间】:2013-11-06 14:36:12
【问题描述】:

我已经添加了这个

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

当我滚动鼠标滚轮时,它会完美滚动列表,我的滚动事件不会触发。

我试过hook MouseWheel,但是在mousewheel事件返回windows之后会发生滚动,但仍然没有调用Scroll事件。

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

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

【问题讨论】:

  • 添加编辑以解释鼠标滚轮不起作用

标签: c# .net listview


【解决方案1】:

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

}

【讨论】:

    【解决方案2】:

    默认列表视图的可视化树有 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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多