【问题标题】:Getting mouse enter event on full panel c#在全面板c#上获取鼠标输入事件
【发布时间】:2013-01-29 07:45:13
【问题描述】:

所以我有一个面板,它使用 DockStyle.Top 以编程方式填充自定义控件。

我需要的是让面板在鼠标光标进入面板时以某种方式获得焦点,以便用户可以使用鼠标滚轮滚动面板。

我真的不想给每个控件一个处理程序,因为可能有数百个控件。

一种方法是检查鼠标位置并检查面板是否包含它,这可能需要额外的线程或鼠标钩,但也许有更好的方法?

【问题讨论】:

  • 有一个属性Tag。您可以将一个事件处理程序绑定到所有面板并使用Tag 标识它们。如果你需要一些先进的东西(我没有任何真实的例子)。无论如何,处理程序的第一个参数包含发件人object sender,您可以转换一个Panel myPanel = sender as Panel;
  • 创建单个处理函数。在InitializeComponent 函数中,为每个控件分配相同的处理程序。
  • @PLB 这不起作用,因为面板不会看到鼠标,因为它在其他控件之下。
  • @sgar91 每次更新面板时仍然需要一个“大规模”循环

标签: c# winforms events


【解决方案1】:

您可以将Amen Ayach 发布的MouseDetector class 实现为类似问题的answer,并在鼠标悬停时激活表单:

void m_MouseMove(object sender, Point p)
{
    Point pt = this.PointToClient(p);
    if (this.ClientSize.Width >= pt.X &&
                    this.ClientSize.Height >= pt.Y &&
                    pt.X > 0 && pt.Y > 0)
    {
        this.Activate();
    }
}

您还应该将PanelAutoScroll 值设置为true

panel.AutoScroll = true;

【讨论】:

  • 这似乎工作得很好,除了添加一个计时器,考虑到我可以使用单个实例来处理我需要的任何焦点,这还不错,谢谢!不知道我是怎么错过的......即使我之前读过答案:P
猜你喜欢
  • 2023-03-06
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 2010-10-19
相关资源
最近更新 更多