![](/img/trans.png)
[英]Need help converting custom C# Windows forms controls to custom C# Universal Windows Platform controls
[英]Custom controls in C# Windows Forms mouse event question
我有一个用于Panel控件的mouseenter和mouseleave事件,当鼠标进入时会改变背景颜色,当它离开时会返回白色。
我也在此面板中有Label控件,但当鼠标进入Label控件时,面板的mouseleave事件将触发。
这是有道理的,但是当鼠标位于其区域而其他控件不会影响它时,如何保持Panel的背景颜色相同?
您可以使用GetChildAtPoint()来确定鼠标是否在子控件上。
private void panel1_MouseLeave(object sender, EventArgs e)
{
if (panel1.GetChildAtPoint(panel1.PointToClient(MousePosition)) == null)
{
panel1.BackColor = Color.Gray;
}
}
如果控件实际上不是子控件,您仍然可以使用MousePosition和PointToScreen来确定鼠标是否仍在控件的范围内。
private void panel1_MouseLeave(object sender, EventArgs e)
{
Rectangle screenBounds = new Rectangle(this.PointToScreen(panel1.Location), panel1.Size);
if (!screenBounds.Contains(MousePosition))
{
panel1.BackColor = Color.Gray;
}
}
为包含的控件添加事件意味着当您想要向面板添加另一个控件时,您也必须执行相同的练习。
为父控件添加事件意味着只要您想在其他位置使用面板,就必须为新父控件执行相同的操作。 当面板的要求发生变化时,您必须记住将处理从父控件的事件中取出。
所有这些都可能更加混乱。
我倾向于在面板的鼠标离开事件中进行一些坐标检查,并且只有在鼠标真的超出面板边界时才重置面板颜色。
这样,您的面板处理代码仅保留在相关面板上。
我找到了一个简单的解决方 我只是在标签上将enabled属性设置为false,这很好。
您可以为标签添加MouseEnter事件,该事件也设置Panel的背面颜色。 您不需要标签的MouseLeave事件。
要么:
如果您想在不触及父控件代码的情况下执行上述第2点(根据其他用户的注释),您可以在Panel的ParentChanged事件中执行以下操作:
private void panel1_ParentChanged(object sender, EventArgs e)
{
Panel thisPanel = sender as Panel;
if(thisPanel != null && thisPanel.Parent != null)
{
thisPanel.Parent.MouseEnter += delegate(object senderObj, EventArgs eArgs) { thisPanel.BackColor = SystemColors.Control; };
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.