为不可见面板触发事件 - .Net
Trigger an event for an invisible Panel - .Net
我创建了一个面板(Windows 表单面板),它覆盖了表单的一个表面。
面板:面板 triggerDataRefreshStudentPanel = new Panel();
我想触发这个事件(当鼠标进入面板区域时,触发这个事件)
triggerDataRefreshStudentPanel_MouseEnter();
我设置为:
triggerDataRefreshStudentPanel.Enabled = true, triggerDataRefreshStudentPanel.Visible = false;
但是,该事件不起作用,只有当两者都为真时它才起作用。我只想启用面板,但不可见。实际上,我想在鼠标进入某个区域时触发一些东西……这就是我选择这样做的原因。或者,还有其他方法可以做我想做的事吗?
试试 Link 中的这个解决方案
或者尝试制作具有透明背景的面板...这样面板将可见但具有透明背景..
禁用的 and/or 不可见控件不会调用大量输入事件,包括鼠标事件。这就是禁用控件功能的想法。
但是,当鼠标在禁用的 and/or 不可见子控件上操作时,父控件会收到鼠标事件。因此,您可以处理父级的 MouseMove
事件,以便在鼠标进入和离开禁用控件的边界时得到通知。
处理父控件的MouseMove
事件如下:
// To avoid the redundant calls...
private bool isMouseEntered;
// `ParentControl` the parent of the disabled control. Form, Panel, GroupBox...
private void ParentControl_MouseMove(object sender, MouseEventArgs e)
{
// Optional to execute this code only when the control
// is disabled or invisible.
if (disabledControl.Enabled && disabledControl.Visible) return;
if (disabledControl.Bounds.Contains(e.Location))
{
if (!isMouseEntered)
{
isMouseEntered = true;
// Call/do here whatever you want...
}
}
else if (isMouseEntered)
{
isMouseEntered = false;
// If you have something to do when the mouse leaves
// the disabled/invisible control...
}
}
编辑
确保您已正确添加父级的 MouseMove
处理程序。使用带有断点的调试器来确认这一点。
将上述解决方案应用于链接代码:
private bool isMouseEntered;
private void CZUMain_MouseMove(object sender, MouseEventArgs e)
{
if (triggerDataRefreshStudentPanel.Bounds.Contains(e.Location))
{
if (!isMouseEntered)
{
isMouseEntered = true;
if (_connectedUserType == "student")
{
actions = StudentsPanel.studentTriggerNewRefresh(_connectedUser, ref _studentLastMeeting, ref _studentLastAssignment, ref _studentLastColleague, ref _studentLastCourse);
refreshStudentData(actions);
//
}
else
{
StudentsPanel.updateTeachedClassesList(selectClassID, ref teachedClassesIDs, connectedUser); // updating Teacher Teached Classes List every time he clicks
}
}
}
else if (isMouseEntered)
{
isMouseEntered = false;
// ...
}
}
我创建了一个面板(Windows 表单面板),它覆盖了表单的一个表面。 面板:面板 triggerDataRefreshStudentPanel = new Panel(); 我想触发这个事件(当鼠标进入面板区域时,触发这个事件)
triggerDataRefreshStudentPanel_MouseEnter();
我设置为:
triggerDataRefreshStudentPanel.Enabled = true, triggerDataRefreshStudentPanel.Visible = false;
但是,该事件不起作用,只有当两者都为真时它才起作用。我只想启用面板,但不可见。实际上,我想在鼠标进入某个区域时触发一些东西……这就是我选择这样做的原因。或者,还有其他方法可以做我想做的事吗?
试试 Link 中的这个解决方案 或者尝试制作具有透明背景的面板...这样面板将可见但具有透明背景..
禁用的 and/or 不可见控件不会调用大量输入事件,包括鼠标事件。这就是禁用控件功能的想法。
但是,当鼠标在禁用的 and/or 不可见子控件上操作时,父控件会收到鼠标事件。因此,您可以处理父级的 MouseMove
事件,以便在鼠标进入和离开禁用控件的边界时得到通知。
处理父控件的MouseMove
事件如下:
// To avoid the redundant calls...
private bool isMouseEntered;
// `ParentControl` the parent of the disabled control. Form, Panel, GroupBox...
private void ParentControl_MouseMove(object sender, MouseEventArgs e)
{
// Optional to execute this code only when the control
// is disabled or invisible.
if (disabledControl.Enabled && disabledControl.Visible) return;
if (disabledControl.Bounds.Contains(e.Location))
{
if (!isMouseEntered)
{
isMouseEntered = true;
// Call/do here whatever you want...
}
}
else if (isMouseEntered)
{
isMouseEntered = false;
// If you have something to do when the mouse leaves
// the disabled/invisible control...
}
}
编辑
确保您已正确添加父级的
MouseMove
处理程序。使用带有断点的调试器来确认这一点。将上述解决方案应用于链接代码:
private bool isMouseEntered;
private void CZUMain_MouseMove(object sender, MouseEventArgs e)
{
if (triggerDataRefreshStudentPanel.Bounds.Contains(e.Location))
{
if (!isMouseEntered)
{
isMouseEntered = true;
if (_connectedUserType == "student")
{
actions = StudentsPanel.studentTriggerNewRefresh(_connectedUser, ref _studentLastMeeting, ref _studentLastAssignment, ref _studentLastColleague, ref _studentLastCourse);
refreshStudentData(actions);
//
}
else
{
StudentsPanel.updateTeachedClassesList(selectClassID, ref teachedClassesIDs, connectedUser); // updating Teacher Teached Classes List every time he clicks
}
}
}
else if (isMouseEntered)
{
isMouseEntered = false;
// ...
}
}