我对 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/