c#.net获胜表单中的自定义工具提示
本文关键字:自定义 工具提示 表单 net 获胜 | 更新日期: 2023-09-27 18:28:31
我想模拟一个自定义工具提示,就像你在使用c#.NET 4.5 windows窗体的网站上看到的那样。这个工具提示基本上会显示一些任务的状态,比如有多少任务是挂起的、正在处理的、已完成的等等。为此,我使用了一个无边界的winform。这个winform会有一些文本、图像等。我希望它在按钮的mouseHover事件中显示出来,并在MouseLeave事件中消失。我的问题是,在MouseOver事件中,工具提示表单的许多实例正在生成,而在MouseLeave上,它们并没有关闭。我的代码是
private void B_MouseHover(object sender, EventArgs e)
{
frmSecQStatToolTipDlg tooltip = new frmSecQStatToolTipDlg();
tooltip.Location = this.PointToScreen(new Point(this.Left, this.Bottom));
tooltip.Show();
}
private void B_MouseLeave(object sender, EventArgs e)
{
frmSecQStatToolTipDlg tooltip = new frmSecQStatToolTipDlg();
tooltip.Close();
}
我的代码不起作用,因此请告诉我如何以正确的方式执行此操作。感谢
每次获得悬停事件和休假事件时,都会生成表单类的新实例。如果你想继续使用这种方法,我建议你在主窗体对象上使用一个变量来存储对工具提示窗体的引用。其次,无论何时调用事件处理程序,你都不需要生成新的实例,而是只在必要时生成。我会在第一次为特定控件调用Hover事件时创建实例,然后在调用Leave处理程序时处理它——这是在假设工具提示对话框的构造函数为悬停的每个控件加载不同的信息的情况下进行的。像这样:
frmSecQStatToolTipDlg f_tooltip;
private void B_MouseHover(object sender, EventArgs e)
{
if(frmSecQStatToolTipDlg == null)
{
f_tooltip = new frmSecQStatToolTipDlg();
}
tooltip.Location = this.PointToScreen(new Point(this.Left, this.Bottom));
tooltip.Show();
}
private void B_MouseLeave(object sender, EventArgs e)
{
if(f_tooltip != null)
{
f_tooltip.Close();
f_tooltip = null;
}
}
您应该为该表单保留一个全局字段,而不应该使用dispose
或close
。只需在某些事件中使用hide
,然后再次使用show
。
示例代码:
frmSecQStatToolTipDlg tooltip;
private void B_MouseHover(object sender, EventArgs e)
{
if(frmSecQStatToolTipDlg == null)
{
tooltip = new frmSecQStatToolTipDlg();
}
tooltip.Location = this.PointToScreen(new Point(this.Left, this.Bottom));
tooltip.Show();
}
private void B_MouseLeave(object sender, EventArgs e)
{
if(frmSecQStatToolTipDlg != null)
{
tooltip.Hide();
}
}
有了这个逻辑,你就不必一次又一次地创建tooltip
实例,如果你经常做这个活动,也不会花时间弹出。
将工具提示声明为只读一次,并在不询问是否为null的情况下使用它。如果需要Dispose,请实现IDisposable模式:https://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx
private readonly frmSecQStatToolTipDlg _tooltip = new frmSecQStatToolTipDlg() ;
private void B_MouseHover(object sender, EventArgs e)
{
_tooltip.Location = this.PointToScreen(new Point(this.Left, this.Bottom));
_tooltip.Show();
}
private void B_MouseLeave(object sender, EventArgs e)
{
_tooltip.Hide();
}