【问题标题】:Preview mouse wheel on AutoScroll Panel在自动滚动面板上预览鼠标滚轮
【发布时间】:2014-10-14 12:39:02
【问题描述】:

让我们有一个大的Control(它的Size 是外部给出的并且“不能”改变)。这个Control 包含在Panel 中。有一个非常有用的功能Panel.Autoscroll = true,它可以轻松滚动大Control,而无需工作。

有一个问题:Control 需要处理MouseWheel(它按预期获取事件 - 它专注于鼠标输入)。幸运的是,Panel also 捕获了相同的鼠标滚轮事件并将它们用于滚动。对于Control“消耗”事件的情况,这是不可取的。

我找不到处理此问题的标准方法。甚至Panel.Scroll 事件也仅在鼠标单击滚动时调用,而不是鼠标滚轮滚动。

是否有一种自然的 WinForms 友好方式如何临时指示 PanelAutoScroll 设置为 true 不处理鼠标滚轮事件以进行滚动?

【问题讨论】:

  • 问题是控件消耗事件。它使用该事件,然后让它冒泡到其父级。后台is here.
  • 是的,我知道它没有,但由于 MouseEventArgs 中没有标志来表示它,它提出了我的问题。你怎么知道它实际上是 HandledMouseEventArgs (因此它包含消费标志)?只需(安全地)投射它并为消费情况设置 Handled 就足够了。谢谢!
  • 不知道这一点。甚至比 ILSpy 还要好。

标签: c# winforms panel autoscroll


【解决方案1】:

使用此版本将您的面板替换为 AutoScroll = True,这样可以取消对 OnMouseWheel 方法的基本调用:

public class PanelEx: Panel {
  protected override void OnMouseWheel(MouseEventArgs e) {
    //base.OnMouseWheel(e);
  }
}

或者正如 Hans 从他的 linked answer 中指出的那样,在您的控件中将 Handled 属性设置为 true:

protected override void OnMouseWheel(MouseEventArgs e) {
  base.OnMouseWheel(e);
  ((HandledMouseEventArgs)e).Handled = true;
}

【讨论】:

  • 不停止冒泡,现在表单滚动:) 正确的修复是 ((HandledMouseEventArgs)e).Handled = true;
  • 无需派生新面板。将其转换为鼠标滚轮事件处理程序中的默认实现就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
相关资源
最近更新 更多