![](/img/trans.png)
[英]Wheel-button's middle-button MouseDown event doesn't happen if you scroll the Mouse Wheel first
[英]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.