鼠标滚轮在winforms冒泡?

时间:2011-08-08 14:35:42

标签: c# winforms scroll

我对winforms和mousewheel事件有一点问题。 我有一个表示滑块的自定义用户控件。现在,我有几组滑块,其中每个组都包含在一个面板中。然后将所有组包装在另一个面板(AutoScroll设置为true)中,并将其包装在一个表单中。实现滑块逻辑,使得鼠标轮可用于改变其值。为此,滑块用户控件在鼠标滑过滑块时获得焦点。但是,当我滚动时,AutoScroll父面板也会滚动它。 我已经在这个问题上浪费了很多时间。有谁知道这里发生了什么以及如何解决它?我认为事件正在冒泡到父面板,但是在Slider控件中处理它时,我没有在事件上找到Handled属性(就像WPF一样)。

非常感谢

2 个答案:

答案 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);