我对winforms和鼠标滚轮事件有点小问题。我有一个表示滑块的自定义用户控件。现在,我有几组滑块,每组都被包裹在一个面板中。然后将所有组包装在另一个面板中(该面板将AutoScroll设置为true),并将其包装在一个表单中。实现滑块逻辑,以便可以使用鼠标滚轮来改变其值。为此,滑块用户控件在鼠标悬停在滑块上时获得焦点。但是,当我滚动时,AutoScroll父面板也随之滚动。我已经在这个问题上浪费了很多时间。有人知道这里发生了什么吗?我该如何解决它?我以为事件会冒泡到父面板,但在Slider控件中处理它时,我没有在事件上找到Handled属性(就像使用WPF时可能的那样)。
非常感谢
发布于 2011-08-09 03:15:12
我们将滑块实现为一个完整的自定义用户控件(继承了UserControl类),具有自己的外观。
您可能已经注意到,UserControl不会在“属性”窗口中显示MouseWheel事件。有麻烦的迹象。WM_MOUSEWHEEL消息将弹出。如果具有焦点的控件不能处理它,Windows就会将它传递给它的父级。重复执行,直到找到想要处理它的父窗口。你的案子里的专家小组。
你需要在你的滑块控件中调用一些黑魔法。传递给MouseWheel事件的实际事件参数对象不是事件签名所暗示的MouseEventArgs类型,而是HandledMouseEventArgs类型。它可以让你停止冒泡。如下所示:
protected override void OnMouseWheel(MouseEventArgs e) {
base.OnMouseWheel(e);
// do the slider scrolling
//..
((HandledMouseEventArgs)e).Handled = true;
}发布于 2011-08-08 22:53:16
如果您像这样动态创建事件
object.event += new EventHandler<EventArgs>(eventfunction);尝试在调用eventfunction后注销事件,如下所示
object.event -= new EventHandler<EventArgs>(eventfunction);https://stackoverflow.com/questions/6983757
复制相似问题