c# - 鼠标滚轮在 winforms 中冒泡?

标签 c# winforms scroll

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

非常感谢

最佳答案

We implemented the Slider as a complete custom user control (inheriting the UserControl class) with own look-and-feel.

您可能已经注意到 UserControl 没有在“属性”窗口中显示 MouseWheel 事件。那里有麻烦的迹象。 WM_MOUSEWHEEL 消息冒泡。如果具有焦点的控件不处理它,则 Windows 将它传递给它的父控件。如此反复,直到找到要处理它的父窗口。您案例中的专家组。

您需要在 slider 控件中调用一些黑魔法。传递给 MouseWheel 事件的实际事件参数对象不是事件签名所暗示的 MouseEventArgs 类型,而是 HandledMouseEventArgs。这可以让你停止冒泡。像这样:

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

关于c# - 鼠标滚轮在 winforms 中冒泡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6983757/

相关文章:

jquery - 添加 jquery 滚动/点击功能

c# - 找不到适合指定文化或中性文化的任何资源

c# - 有没有办法使用 AES SH-256 对数据进行时间锁定加密?

c# - 使窗体的背景透明

C#:如何防止调用失败

jQuery - 禁用滚动 body,启用滚动 div

c# - 从更大的 TimeSpan 中减去不同年份的 TimeSpan

c# - 多线程文件访问(加锁控制)

c# - 如何在RDLC中设置参数值

jquery - 如何在窗口滚动的特定高度触发引导模式,仅一次?