我对winforms和mousewheel事件有一点问题。 我有一个表示滑块的自定义用户控件。现在,我有几组滑块,其中每个组都包含在一个面板中。然后将所有组包装在另一个面板(AutoScroll设置为true)中,并将其包装在一个表单中。实现滑块逻辑,使得鼠标轮可用于改变其值。为此,滑块用户控件在鼠标滑过滑块时获得焦点。但是,当我滚动时,AutoScroll父面板也会滚动它。 我已经在这个问题上浪费了很多时间。有谁知道这里发生了什么以及如何解决它?我认为事件正在冒泡到父面板,但是在Slider控件中处理它时,我没有在事件上找到Handled属性(就像WPF一样)。
非常感谢答案 0 :(得分:14)
我们将Slider作为一个完整的自定义用户控件(继承UserControl类)实现了自己的外观。
您可能已经注意到UserControl未在“属性”窗口中显示MouseWheel事件。那里有麻烦。 WM_MOUSEWHEEL消息气泡。如果具有焦点的控件不处理它,则Windows将其传递给它的Parent。反复,直到找到想要处理它的父窗口。专家小组。
你需要在滑块控件中调用一些黑魔法。传递给MouseWheel事件的实际事件args对象不是MouseEventArgs类型,如事件签名所示,它是HandledMouseEventArgs。这让你停止冒泡。像这样:
protected override void OnMouseWheel(MouseEventArgs e) {
base.OnMouseWheel(e);
// do the slider scrolling
//..
((HandledMouseEventArgs)e).Handled = true;
}
答案 1 :(得分:0)
如果您正在动态创建事件,例如
object.event += new EventHandler<EventArgs>(eventfunction);
尝试在调用事件函数后取消注册事件
object.event -= new EventHandler<EventArgs>(eventfunction);