您的位置:首页 > 编程语言 > C#

解决方案:c#鼠标离开到子控件也触发MouseLeave事件的解决方法

2013-01-31 17:48 956 查看
最近做c#的UI开发,有个非常烦恼的问题,就是Panel的MouseLeave事件,当鼠标移动到Panel的子控件时也会触发MouseLeave事件,摸索了半天,终于发现了一个高效的方法。
该方法的思想是当Panel添加子控件时,为添加的子控件也添加鼠标离开事件,当子控件发生鼠标离开事件时,判断是否鼠标坐标在Panel的Rectangle内,如果在Panel内则不发生事件,否则就发生Panel的离开事件。当然,Panel也要重写鼠标离开事件,如果鼠标离开时是在本身的Rectangle内,则不发生离开事件,否则就正常发生了。以下SelfDefinePanel继承Panel类并重写OnMouseLeave方法和OnControlAdded方法。

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace Kingray.View.Component
{
/// <summary>
///
/// </summary>
public class SelfDefinePanel: Panel
{
public SelfDefinePanel()
{
SetStyle(ControlStyles.DoubleBuffer, true);//ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.UserPaint, true);
this.UpdateStyles();
}
/// <summary>
/// 重写OnControlAdded方法,为每个子控件添加MouseLeave事件
/// </summary>
/// <param name="e"></param>
protected override void OnControlAdded(ControlEventArgs e)
{
Control control = e.Control; // 获取添加的子控件
control.MouseLeave += this.SubControlLeave; // 当鼠标离开该子控件时判断是否是离开SelfDefinePanel
base.OnControlAdded(e);
}
/// <summary>
/// 重写OnMouseLeave事件,如果是离开本身的矩形区域则发生 base.OnMouseLeave(e);
/// </summary>
/// <param name="e"></param>
protected override void OnMouseLeave(EventArgs e)
{
//Console.WriteLine(" OnMouseLeave ClientRectangle ------------------ " + this.RectangleToScreen(this.ClientRectangle));
//判断鼠标是否还在本控件的矩形区域内
if (!this.RectangleToScreen(this.ClientRectangle).Contains(Control.MousePosition)) // this.RectangleToScreen(this.ClientRectangle) 映射为屏幕的矩形
{
base.OnMouseLeave(e);
//Console.WriteLine(" ------------------ SelfDefinePanel OnMouseLeave ------------------ ");
}
}
/// <summary>
/// 子控件鼠标离开时也要做相应的判断
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void SubControlLeave(Object sender, EventArgs e)
{
//Console.WriteLine(" SubControlLeave ClientRectangle ------------------ " + this.RectangleToScreen(this.ClientRectangle));
//判断鼠标是否还在本控件的矩形区域内
if (!this.RectangleToScreen(this.ClientRectangle).Contains(Control.MousePosition))
{
base.OnMouseLeave(e);
//Console.WriteLine(" ------------------ SubControlLeave ------------------ ");
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐