今天在做一个功能的时候,需要在鼠标在UserControl的区域和不在的时候,呈现两种不同的样式。
一开始的时候觉得应该很好处理,直接注册UserControl的MouseLeave事件,然后在里面处理逻辑即可。然后并没有那么简单,首先,我发现在没有离开UserControl的时候,也会触发事件,相当不理解。
为了解决这个问题,加入了判断
if (!this.RectangleToScreen(this.ClientRectangle).Contains(Control.MousePosition))
然而还是一样的效果,我误以为是计算位置的方式错了,经过多次确认,计算鼠标相对位置的方法无误。
最后在一篇博客中看到,如果UserControl中有子控件,那么在在各自的子控件中会有其MouseLeave事件,也就是说,从UserControl移动到其内部的TextBox控件,也是会触发UserControl的MouseLeave事件的。而相应的,如果从TextBox进入然后出UserControl的区域,是不会触发UserControl的MouseLeave事件滴。
那么解决方案就是,在UserControl的所有子控件上,都注册MouseLeave事件,并且做相同的处理,至此,问题解决!
PS----其实很多其他的事件也都是一样的道理。