我有一个List<Rectangle> myRectangles
在Panel控件中呈现。如果我想在鼠标位于任何myRectangles内时触发事件处理程序,那么我最好选择“foreach”吗?然后去做任何myRectangle.OnMouseMove()会做什么?
答案 0 :(得分:2)
这似乎是Reactive LINQ或Rx的一个很好的用途,但我对使用前者更熟悉。
http://tomasp.net/blog/reactive-ii-csevents.aspx
您需要优化以确定哪些矩形可能会相交,但只需使用OnMouseMove,然后在LINQ查询中,您将找到输入的任何矩形。
这可能会让人感到害怕。
答案 1 :(得分:1)
不要对矩形使用控件,它们非常昂贵且不能重叠。仅使用OnMouseMove()方法无法使其可靠,当用户快速移动鼠标和/或矩形边缘靠近面板边框时,您将错过鼠标移动到面板外部。使用Control.Capture属性可以轻松解决此问题。一些示例代码:
public event EventHandler InsideRectangles;
private List<Rectangle> mRectangles = new List<Rectangle>();
private bool mInside;
protected void OnInsideRectangles(EventArgs e) {
EventHandler handler = InsideRectangles;
if (handler != null) handler(this, e);
}
protected override void OnMouseMove(MouseEventArgs e) {
bool inside = false;
foreach (var rc in mRectangles) {
if (rc.Contains(e.Location)) {
inside = true;
break;
}
}
if (inside && !mInside) OnInsideRectangles(EventArgs.Empty);
this.Capture = inside;
mInside = inside;
base.OnMouseMove(e);
}
答案 2 :(得分:0)
您可以创建一个控件,其中一个在另一个内部有一个矩形。外部矩形的OnMouseMove将被暴露。外部矩形将是不可见的。通过这种方式,您可以让Windows管理事件调用,而不会出现混乱的代码。
答案 3 :(得分:0)
我假设您必须使用Winforms?如果是这样,您可能需要考虑使矩形分离子控件(渲染OnPaint
中的矩形)并使用Control
提供的鼠标事件。