鼠标滚轮在winforms冒泡?

Chr*_*ris 3 c# scroll winforms

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

非常感谢

Han*_*ant 14

我们将Slider实现为一个完整的自定义用户控件(继承UserControl类),具有自己的外观.

您可能已经注意到UserControl未在"属性"窗口中显示MouseWheel事件.那里有麻烦.WM_MOUSEWHEEL消息气泡.如果具有焦点的控件不处理它,则Windows将其传递给它的Parent.反复,直到找到想要处理它的父窗口.小组在你的情况下.

你需要在滑块控件中调用一些黑魔法.即获得通过,以鼠标滚轮事件的实际事件参数对象不是MouseEventArgs类型作为事件的签名表明,它是HandledMouseEventArgs.这让你停止冒泡.像这样:

    protected override void OnMouseWheel(MouseEventArgs e) {
        base.OnMouseWheel(e);
        // do the slider scrolling
        //..
        ((HandledMouseEventArgs)e).Handled = true;
    }
Run Code Online (Sandbox Code Playgroud)