Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 鼠标滚轮在winforms中冒泡?_C#_Winforms_Scroll - Fatal编程技术网

C# 鼠标滚轮在winforms中冒泡?

C# 鼠标滚轮在winforms中冒泡?,c#,winforms,scroll,C#,Winforms,Scroll,我对winforms和鼠标滚轮事件有点问题。 我有一个表示滑块的自定义用户控件。现在,我有两组滑块,每组都封装在一个面板中。然后将所有组包装在另一个面板中(该面板的AutoScroll设置为true),并将其包装在表单中。滑块逻辑的实现使得鼠标滚轮可用于更改其值。为此,当鼠标位于滑块上时,滑块用户控件将获得焦点。但是,当我滚动时,AutoScroll父面板也随之滚动。 在这个问题上我已经浪费了很多时间。有人知道这里发生了什么,我怎么解决吗?我以为该事件会冒泡到父面板,但在滑块控件中处理该事件时,

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


如果您正在像这样动态创建事件,非常感谢

object.event += new EventHandler<EventArgs>(eventfunction);
object.event+=新的EventHandler(eventfunction);
在像这样调用eventfunction之后尝试取消注册事件

object.event -= new EventHandler<EventArgs>(eventfunction);
object.event-=新的EventHandler(eventfunction);

如果您正在动态创建事件,如

object.event += new EventHandler<EventArgs>(eventfunction);
object.event+=新的EventHandler(eventfunction);
在像这样调用eventfunction之后尝试取消注册事件

object.event -= new EventHandler<EventArgs>(eventfunction);
object.event-=新的EventHandler(eventfunction);
我们将滑块实现为一个具有自己外观的完整自定义用户控件(继承UserControl类)

您可能已经注意到,UserControl不会在属性窗口中显示MouseWheel事件。那里有麻烦的迹象。WM_鼠标滚轮消息出现气泡。如果具有焦点的控件不处理它,则Windows会将其传递给其父控件。重复,直到找到要处理它的父窗口为止。你的案件中的陪审团

您需要在滑块控件中调用一些黑魔法。传递给MouseWheel事件的实际事件args对象不是事件签名所建议的MouseEventArgs类型,而是HandledMouseEventArgs。让你停止冒泡。像这样:

    protected override void OnMouseWheel(MouseEventArgs e) {
        base.OnMouseWheel(e);
        // do the slider scrolling
        //..
        ((HandledMouseEventArgs)e).Handled = true;
    }
我们将滑块实现为一个具有自己外观的完整自定义用户控件(继承UserControl类)

您可能已经注意到,UserControl不会在属性窗口中显示MouseWheel事件。那里有麻烦的迹象。WM_鼠标滚轮消息出现气泡。如果具有焦点的控件不处理它,则Windows会将其传递给其父控件。重复,直到找到要处理它的父窗口为止。你的案件中的陪审团

您需要在滑块控件中调用一些黑魔法。传递给MouseWheel事件的实际事件args对象不是事件签名所建议的MouseEventArgs类型,而是HandledMouseEventArgs。让你停止冒泡。像这样:

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

我认为卷轴只受哪个项目有焦点的影响,而不只是停留在它上面。@MPelletier它不同。例如,在outlook中是通过悬停,但在VisualStudio中是通过聚焦。我使用MouseEnter事件聚焦我的用户控件。这样我就可以在聚焦滑块用户控件上使用鼠标滚轮。控制盘工作正常,唯一的问题是父面板也会同时滚动。什么是“滑块”?在可滚动的面板中有一个轨迹条,我对此没有任何修改。@Hans Passant:我们实现了一个完整的自定义用户控件(继承UserControl类),具有自己的外观和感觉。当鼠标悬停在控件上时,我们对用户控件进行选择(聚焦),然后使用鼠标滚轮更改滑块的值。除了父级AutoScroll面板也会滚动的问题外,此功能工作正常。当鼠标离开用户控件时,焦点将更改为父控件,当使用鼠标滚轮时,滑块的滚动将按预期停止。我认为滚动只受具有焦点的项目的影响,而不仅仅是在其上方悬停。@MPelletier它有所不同。例如,在outlook中是通过悬停,但在VisualStudio中是通过聚焦。我使用MouseEnter事件聚焦我的用户控件。这样我就可以在聚焦滑块用户控件上使用鼠标滚轮。控制盘工作正常,唯一的问题是父面板也会同时滚动。什么是“滑块”?在可滚动的面板中有一个轨迹条,我对此没有任何修改。@Hans Passant:我们实现了一个完整的自定义用户控件(继承UserControl类),具有自己的外观和感觉。当鼠标悬停在控件上时,我们对用户控件进行选择(聚焦),然后使用鼠标滚轮更改滑块的值。除了父级AutoScroll面板也会滚动的问题外,此功能工作正常。当鼠标离开用户控件时,焦点将更改为父控件,当使用鼠标滚轮时,滑块的滚动将按预期停止。老兄,你是一个救生员。非常感谢你这么做。我觉得这很令人不安,我在微软的文档中找不到任何解释。也许我看过了?你没看过。你因为使用用户控制而不是控制而陷入麻烦。老兄,你是个救生员。非常感谢你这么做。我觉得这很令人不安,我在微软的文档中找不到任何解释。也许我看过了?你没看过。您使用UserControl而不是Control时遇到了麻烦。