This question already has answers here:
Pass-through mouse events to parent control
(3个答案)
6年前关闭。
我正在测试以下代码:
这个想法是,当鼠标进入容器控件左侧的32像素宽的区域时,会出现一条消息(确定,在R / L中它将执行其他操作,但这仅是目前的测试)。
问题在于,当子控件填充矩形区域时,ContainerControl不会收到MouseMove事件,因为该事件由子控件处理。
所以我的问题是,即使我的ContainerControl的子代填充了相同的矩形区域,如何使我的ContainerControl接收MouseMove事件?
这将返回给定父控件中所有子控件及其子控件等的列表。然后,您可以执行以下操作:
您必须使用
(3个答案)
6年前关闭。
我正在测试以下代码:
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
Rectangle leftRect = new Rectangle(0, 0, 32, this.Height);
if (leftRect.Contains(e.Location))
{
MessageBox.Show("Hello World");
}
}
这个想法是,当鼠标进入容器控件左侧的32像素宽的区域时,会出现一条消息(确定,在R / L中它将执行其他操作,但这仅是目前的测试)。
问题在于,当子控件填充矩形区域时,ContainerControl不会收到MouseMove事件,因为该事件由子控件处理。
所以我的问题是,即使我的ContainerControl的子代填充了相同的矩形区域,如何使我的ContainerControl接收MouseMove事件?
最佳答案
WPF在这种事情上要好得多。我经常使用这样的功能:
public static List<Control> GetAllControlsRecurs(List<Control> list,
Control parent)
{
if (parent == null)
return list;
else
{
list.Add(parent);
}
foreach (Control child in parent.Controls)
{
GetAllControlsRecurs(list, child);
}
return list;
}
这将返回给定父控件中所有子控件及其子控件等的列表。然后,您可以执行以下操作:
private void Form1_Load(object sender, EventArgs e)
{
List<Control> ctlList = new List<Control>();
GetAllControlsRecurs(ctlList, this);
foreach (Control ctl in ctlList) ctl.MouseMove += Form1_MouseMove;
}
您必须使用
ControlAdded
处理动态添加(和删除)的控件,但这至少应该为您提供一个起点。请注意,这不会在重写的OnMouseMove
方法中执行代码,而是在表单的MouseMove
事件处理程序中执行代码。还有很多其他解决方案可以将其构建到派生类中,但是这里的重点是识别和关联子控件到单个事件的方法。09-10 01:31