【问题标题】:WinForms Event Parent scrollWinForms 事件父滚动
【发布时间】:2012-10-20 11:51:51
【问题描述】:

我在一个表单上有两个 FlowLayoutPanelsPanelAPanelB。每个都将在运行时填充多个控件,以便面板滚动(即AutoScroll 为真)。

问题出在:面板填充的每个控件都包含一个ComboBox。因此,MouseWheel 事件由组合框而不是面板使用。我希望面板使用 MouseWheel 事件。

如果子控件上没有可滚动控件,则MouseWheel 事件会跳过子控件(它不处理它)并点击处理它的面板。如何设置我的子控件的组合框以忽略 MouseWheel 事件?我可以告诉它重新发起活动吗?

每当其中一个子控件勾选“MouseEnter”事件时,我尝试将焦点应用于父级;这解决了滚动问题,但也使子控件完全不可编辑。

我从挖掘中发现的其他一些东西涉及直接摆弄 Windows API,但我发现很难相信这样的东西是必需的。

【问题讨论】:

  • 明确一点,当您单击面板并滚动时,组合框仍然会吃掉事件,对吗?
  • @Kreep:正确。功能看起来如下:如果单击子控件,焦点默认为通过选项卡索引(组合框,它消耗滚轮事件)的第一个可焦点控件。如果在子控件中选择了另一个不消耗滚轮事件的可聚焦控件,则面板将按预期滚动。

标签: c# .net winforms


【解决方案1】:

我测试了以下代码,它似乎可以解决您的问题。基本上,当您单击“FlowLayoutPanel”或鼠标进入它时,您需要将其聚焦:

private void newCheckListQuestionPanel_Click(object sender, EventArgs e)
{
   newCheckListQuestionPanel.Focus(); //allows the mouse wheel to work after the panel is clicked
}
private void newCheckListQuestionPanel_MouseEnter(object sender, EventArgs e)
{
   newCheckListQuestionPanel.Focus(); //allows the mouse wheel to work after the panel has had the mouse move over it
}

【讨论】:

  • 完美,解决了我的问题。根据博客文章,我省略了 Click 事件,它仍然有效。与在 MouseEnter 事件上将焦点应用到父级不同(正如我在上面尝试的那样),此解决方案(面板上的 MouseEnter)使子控件可操作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
相关资源
最近更新 更多