【问题标题】:How to capture Scroll event when mouse is not involved?不涉及鼠标时如何捕获滚动事件?
【发布时间】:2016-02-18 14:30:39
【问题描述】:

我在 flowLayoutPanel 中捕获 Scroll 事件,其中包含一堆控件(文本框)。如果我用鼠标移动滚动条,则正确捕获 Scroll 事件。但是,如果使用 tab 键从控件跳转到控件并且滚动条移动以使文本框获得焦点,则不会引发事件。 这种情况下怎么办,不管怎么修改卷轴我都真的需要抓拍。

我上传了一个可以显示问题的简单项目http://1drv.ms/1UabHkv

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    您正在寻找 GotFocus 活动。还有一个 LostFocus 事件。 它适用于点击、标签、shift+标签等

    textBox1.GotFocus += textBox1_ScrollEvent;
    

    textBox1_ScrollEvent 是滚动的事件处理程序

    【讨论】:

    • 但是使用它我必须为 flowLayoutPanel 内的每个文本框订阅每个 GotFocus 事件,然后在该代码中验证滚动是否已移动。我认为这是矫枉过正,必须有一个更干净的方法。如果在合理的时间内没有找到方法,我会把它作为答案。
    • 正如我所说,由于没有找到替代方案,我使用了这种方法。希望它不会过多地减慢表单的行为。谢谢
    【解决方案2】:

    我认为您没有绑定到正确的事件。 ScrollableControl.Scroll Event 状态的文档:

    当用户通过与滚动条交互滚动通过客户区时,或者当用户在控件之间导航并且活动控件滚动到视图中时,会发生 Scroll 事件。当您编写滚动客户区的代码(例如设置 AutoScrollPosition 属性)时,也会发生 Scroll 事件。

    编辑: 看来 MS 文档确实不正确。我已经使用您的示例项目和我创建的示例项目进行了测试,并且我遇到了相同的行为,Scroll 事件没有在选项卡上甚至在鼠标滚轮上触发。

    似乎最好的做法是实现您自己的滚动条并为您的Panel 关闭Autoscroll

    有关 mroe 信息,请参阅以下 SO 问题:How to use ScrollableControl with AutoScroll set to false

    【讨论】:

    • 描述是美,现实是不一样的。我正在使用该事件,而实际行为与该事件不对应。
    • 能否提供您的代码以便复制?
    • 请给我一点时间来抓住重要的东西
    • 我添加了一个简单的项目来向您展示问题。我把代码放在OneDrive上,链接在问题里。
    • @mjsr 我可以重现您的问题 - 更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多