Sim*_*Var 0 c# user-controls winforms
我有一个UserControl,它可以监听它自己的MouseLeave,以便改变它的背景颜色和一些儿童的可见性.应该失去知名度的孩子,也要听自己的MouseLeave以改变他们的背景颜色.
一切正常的场景是这样的:
有问题的情况是这样的:
这种情况一直发生,因为Child位于UserControl的最边缘.请注意,不仅UserControl的MouseLeave不会触发,而且Child的MouseLeave也不会触发.
为了确定在这种情况下鼠标是否实际上已离开该区域,我必须听其他控件的MouseEnter,然后通知UserControl和Child,但我真的想避免这个解决方案,因为它很难看而不是OOPish .
此外,Child必须位于UserControl的最边缘,并且无法移动.
谁能想到这个问题的巧妙解决方案?
我的测试显示这是一个有效的解决方案.只需要一个自定义用户控件.
public class MyPanel : Panel
{
protected override void OnControlAdded(ControlEventArgs e)
{
e.Control.MouseLeave += DidMouseReallyLeave;
base.OnControlAdded(e);
}
protected override void OnMouseLeave(EventArgs e)
{
DidMouseReallyLeave(this, e);
}
private void DidMouseReallyLeave(object sender, EventArgs e)
{
if (this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition)))
return;
base.OnMouseLeave(e);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3096 次 |
| 最近记录: |